zoukankan      html  css  js  c++  java
  • typescript 中 type 和 interface 的区别

    相同点

    都可以描述一个对象或者函数

    interface

    interface User {
      name: string
      age: number
    }
    
    interface SetUser {
      (name: string, age: number): void;
    }

    type

    type User = {
      name: string
      age: number
    };
    
    type SetUser = (name: string, age: number)=> void;

    都允许拓展(extends)

    interface 和 type 都可以拓展,并且两者并不是相互独立的,也就是说 interface 可以 extends type, type 也可以 extends interface 。 虽然效果差不多,但是两者语法不同

    interface extends interface

    interface Name { 
      name: string; 
    }
    interface User extends Name { 
      age: number; 
    }

    type extends type

    type Name = { 
      name: string; 
    }
    type User = Name & { age: number  };

    interface extends type

    type Name = { 
      name: string; 
    }
    interface User extends Name { 
      age: number; 
    }

    type extends interface

    interface Name { 
      name: string; 
    }
    type User = Name & { 
      age: number; 
    }

    不同点

    type 可以而 interface 不行

    • type 可以声明基本类型别名,联合类型,元组等类型
    // 基本类型别名
    type Name = string
    
    // 联合类型
    interface Dog {
        wong();
    }
    interface Cat {
        miao();
    }
    
    type Pet = Dog | Cat
    
    // 具体定义数组每个位置的类型
    type PetList = [Dog, Pet]
    • type 语句中还可以使用 typeof 获取实例的 类型进行赋值
    // 当你想获取一个变量的类型时,使用 typeof
    let div = document.createElement('div');
    type B = typeof div
    • 其他骚操作
    type StringOrNumber = string | number;  
    type Text = string | { text: string };  
    type NameLookup = Dictionary<string, Person>;  
    type Callback<T> = (data: T) => void;  
    type Pair<T> = [T, T];  
    type Coordinates = Pair<number>;  
    type Tree<T> = T | { left: Tree<T>, right: Tree<T> };

    interface 可以而 type 不行

    interface 能够声明合并

    interface User {
      name: string
      age: number
    }
    
    interface User {
      sex: string
    }
    
    /*
    User 接口为 {
      name: string
      age: number
      sex: string 
    }
    */

    总结

    一般来说,如果不清楚什么时候用interface/type,能用 interface 实现,就用 interface , 如果不能就用 type 。

  • 相关阅读:
    分层图最短路(DP思想) BZOJ2662 [BeiJing wc2012]冻结
    动态规划 BZOJ1925 地精部落
    线性DP SPOJ Mobile Service
    线性DP codevs2185 最长公共上升子序列
    数位DP POJ3208 Apocalypse Someday
    线性DP POJ3666 Making the Grade
    杨氏矩阵 线性DP? POJ2279 Mr.Young's Picture Permutations
    tarjan强连通分量 洛谷P1262 间谍网络
    树链剖分 BZOJ3589 动态树
    二分图 BZOJ4554 [Tjoi2016&Heoi2016]游戏
  • 原文地址:https://www.cnblogs.com/crazycode2/p/14748267.html
Copyright © 2011-2022 走看看