视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Typescript 中的 interface 和 type 到底有什么区别详解
2020-11-27 21:55:03 责编:小采
文档

interface VS type

大家使用 typescript 总会使用到 interface 和 type,官方规范 稍微说了下两者的区别

  • An interface can be named in an extends or implements clause, but a type alias for an object type literal cannot.
  • An interface can have multiple merged declarations, but a type alias for an object type literal cannot.
  • 但是没有太具体的例子。

    明人不说暗话,直接上区别。

    相同点

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

    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 。其他更多详情参看 官方规范文档

    下载本文
    显示全文
    专题