banner
banner
banner
NEWS LETTER

TS-类型兼容

Scroll down

如果x要兼容y,那么y至少具有与x相同的属性(只有检查对象)

比较原始类型和对象类型

1
2
3
4
5
6
7
8
9
10
11
12
13
interface Named {
name: string;
}

let x: Named;
// 这里y推断的类型为{ name: string; location: string; }
let y = { name: 'Alice', location: 'Seattle' };
x = y; // =左边的成员能否在=右边中找到 (名字和类型都要一一对应)

function greet(n: Named) { //Named目标,才会一一检查,传进来的是否能满足要求
console.log('Hello, ' + n.name);
}
greet(y);//对于检查函数的参数也适用

比较两个函数

1
2
3
4
5
6
7
8
9
let x = (a: number) => 0;
let y = (b: number, s: string) => 0;
y = x //跟上面不一样,看的是=右边的成员能否在=左边中找到(且只看类型,名字不同无所谓)

比较返回值类型: 目标函数返回值类型的子类型
let x = () => ({name: 'Alice'});
let y = () => ({name: 'Alice', location: 'Seattle'});

x = y; // 目标函数x的返回类型在y中找得到所以成功
  • 函数参数双向协变: 只有当源函数参数能够赋值给目标函数或者反过来时才能赋值成功。
  • 可选参数及剩余参数: 可选和必须参数是可互换,剩余参数被当作无限个可选参数
  • 函数重载: 源函数的每个重载都要在目标函数上找到对应的函数签名

枚举

  • 不同枚举不兼容(除了枚举与数字枚举互相兼容)

  • 比较两个类类型的对象时,只有实例(方法)的成员会被比较(静态和构造不比较)
  • 类的私有成员和受保护成员:
    • 目标类型包含一个私有/保护成员,那么源类型必须包含来自同一个类的这个私有/保护成员.
    • 这允许子类赋值给父类,但是不能赋值给其它有同样类型的类。

泛型: 没参时,当作any比较;有参时,比较参数类型

1
2
3
4
5
6
interface NotEmpty<T> {
data: T
}
let x: NotEmpty<number>;
let y: NotEmpty<string>;
x = y //error

高级主题: 子类型与赋值

  • 赋值扩展了子类型兼容性,允许和any来回赋值,以及enum和对应数字值之间的来回赋值
  • 类型兼容性是由赋值兼容性来控制的,即使在implements和extends语句也不例外
其他文章
cover
TS-接口与类
  • 24/11/01
  • 11:40
  • TypeScript
cover
TS-枚举
  • 24/11/01
  • 11:40
  • TypeScript
目录导航 置顶
  1. 1. 比较原始类型和对象类型
  2. 2. 比较两个函数
  3. 3. 枚举
  4. 4.
  5. 5. 泛型: 没参时,当作any比较;有参时,比较参数类型
  6. 6. 高级主题: 子类型与赋值
请输入关键词进行搜索