开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情
TS中的兼容性
自动类型推论
- 根据初始值进行类型推论
- 不用明确编辑器具体是什么类型,编译器就知道是什么类型,根据初始化值自动推断 注意:如果是先定义再初始化,那么就推论结果是any
let name = '实则棒'
name = '大坏蛋'
name = 12
name类型已经被推论成string类型,可以给name赋值string,但是不能复制number和其他类型的值了。
下面这个类型推论为number[]类型,
let arr = [1, 2, null];
arr = [2, 3, 4, null, 23, null, true]
如果没有最后一个true,就是合理的。
先定义,再初始化,那推论出来的结果就是any了,无论赋值什么类型的值都是合法的,就和没用ts一样
let age;
age = 19;
age = 'number'
- 上下文推论 typeScript 类型推论也可能按照相反方向进行,这被叫做‘按上下文归类’,按上下文归类会发生在表达式的类型与所处的位置相对时
上下文推论,可以推论出x和y都是number类型,所以该表达式不会报错
interface AddFunction {
(x: number, y: number): number;
}
let f: AddFunction = (x, y) => {
return x + y;
}
对象类型推论
- 可多不可少
- 会进行递归检查 下面这个代码除了最后一句会报错,其他都是合法的, p=n1不报错,证明了对象也有类型推论 p=n2不报错,证明了可以比需要的属性多,多了一个age p=n3报错,证明了不可以比需要的属性少,提示缺少name属性,不能将{age:number}类型赋值给{name:string}类型
interface Person {
name: string;
}
let n1 = {
name: '石头'
}
let n2 = {
name: '石头',
age: 19
}
let n3 = {
age: 19
}
let p: Person;
p = n1;
p = n2;
p = n3;
递归检查 最后一句是会报错的,虽然是第二层级里的age类型不匹配,但是也能检测出来
interface Person {
name: string;
children: {
age: number
}
}
let p1 = { name: '石头', children: { age: 122 } };
let p2 = { name: "实则棒", children: { age: true } };
let p: Person;
p = p1;
p = p2;