任意类型

  1. interface Person {
  2. name: string,
  3. age?: number, //报错,number类型不能赋值给任意类型(string)
  4. [propName: string]: string
  5. }
  6. 任意类型只能定义一个,如果有多个类型可以使用联合类型
  7. interface Person {
  8. age?: number,
  9. [propName: string]: number | string
  10. }

鸭子辨型(只要有部分鸭子特征就是鸭子)

只要有类型的某些属性就是这个类型

  1. interface Person {
  2. name: string
  3. }
  4. function getName(p: Person): string {
  5. return p.name
  6. }
  7. getName({ name: '111', age: 11 }) 报错
  8. let p = { name: '111', age: 11 } 通过定义一个对象传入参数的方式,可以绕开多余类型检查
  9. getName(p) 不报错

绕开类型检查

不推荐

  1. interface Person {
  2. name: string
  3. }
  4. function getName(p: Person): string {
  5. return p.name
  6. }
  7. getName({ name: 'aaa', age: 11 } as Person) 通过断言绕来类型检查
  1. interface Person {
  2. name: string,
  3. [propName: string]: any
  4. }
  5. function getName(p: Person): string {
  6. return p.name
  7. }
  8. getName({ name: 'aaa', age: 11 }) 通过索引签名绕开类型检查

接口与类型的区别

Object/Function

  1. interface Person {
  2. name: string,
  3. age: number
  4. }
  5. type Person = {
  6. name: string,
  7. age: number
  8. }
  9. interface getName {
  10. (name: string): string
  11. }
  12. type getName = (name: string) => string

与接口不同,类型别名还可以用于其他类型,如基本类型(原始值)、联合类型、元组。

  1. // primitive
  2. type Name = string;
  3. // object
  4. type PartialPointX = { x: number; };
  5. type PartialPointY = { y: number; };
  6. // union
  7. type PartialPoint = PartialPointX | PartialPointY;
  8. // tuple
  9. type Data = [number, string];
  10. // dom
  11. let div = document.createElement('div');
  12. type B = typeof div;

接口可以定义多次(这其实也算是扩展的一种),类型别名不可以

  1. interface Point { x: number; }
  2. interface Point { y: number; }
  3. const point: Point = { x: 1, y: 2 };

扩展方式不同

  1. interface Person {
  2. name: string
  3. }
  4. interface Student extends Person {
  5. age: number
  6. }
  7. type Person = {
  8. name: string
  9. }
  10. type Student = Person & {
  11. age: number
  12. }
  13. 接口扩展类型别名
  14. type Person = {
  15. name: string
  16. }
  17. interface Student extends Person {
  18. age: number
  19. }
  20. 类型别名扩展接口
  21. interface Person {
  22. name: string
  23. }
  24. type Student = Person & {
  25. age: number
  26. }

类型别名可以为基本类型、联合类型或元组类型定义别名,而接口不行

  1. type MyNumber = number;
  2. type StringOrNumber = string | number;
  3. type Point = [number, number];

同名接口会自动合并,而类型别名不会

好处就是在使用第三方库的时候,自己可以定义一个一样名字的接口,添加自己的属性来扩展

  1. interface User {
  2. name: string;
  3. }
  4. interface User {
  5. id: number;
  6. }
  7. let user: User = { id: 666, name: "阿宝哥" };
  8. user.id; // 666
  9. user.name; // "阿宝哥"

type场景

定义基本类型的别名

定义函数类型

定义元组类型

定义联合类型

定义映射类型

interface场景

需要用到接口的自动合并特性

定义对象类型,且无需使用type时