目录
- 一.基本数据类型的兼容性
- 二.接口兼容性
- 三.函数的兼容性
-
四.类的兼容性
- 类的私有成员和受保护成员
- 五.泛型的兼容性
- 六.枚举的兼容性
- 标称类型简短介绍
TS 是结构类型系统(structural type system),基于结构/形状检查类型,而非类型的名字。
结构是否兼容
。(核心是考虑安全性,结构化的类型系统(又称鸭子类型检查,如两个类型名字不一样但是无法区分
类型兼容性是基于结构子类型的。 结构类型是一种只使用其成员来描述类型的方式。x要兼容
y
,那么y
至少具有与x
相同的属性。
这里要检查y
是否能赋值给x
,编译器检查x
中的每个属性,看是否能在y
中也找到对应属性。
X 兼容 Y:X(目标类型= Y(源类型
简单一句话概括兼容性: 重新赋值不报错(类型自动转化)一.基本数据类型的兼容性
let temp: string | number; let num!: number; temp = num;
let obj: { toString(: string; }; let str: string = "yya"; obj = str; // 字符串中具备toString(方法,所以可以进行兼容 obj.toString(; // 安全,保证使用的时候不会发生异常
二.接口兼容性
接口的兼容性,只要满足接口中所需要的类型即可!(保证你要的,我都有,就行,多了也没关系
interface IAnimal { name: string; age: number; } interface IPerson { name: string; age: number; address: string; } let animal: IAnimal; let person: IPerson = { name: "yya", age: 18, address: "beijing", }; type T2 = IPerson extends IAnimal ? true : false; // true animal = person; // 子类赋予给父类 兼容
三.函数的兼容性
函数的兼容性主要是比较参数和返回值
参数:赋值函数的参数要少于等于被赋值的函数:也就是说,对应函数的参数来讲,
少的参数可以赋予给多的
,因为内部实现传了多个可以少用或不用(忽略额外的参数在 JavaScript 里是很常见的sum2的每个参数必须能在
sum1
里找到对应类型的参数。 注意的是参数的名字相同与否无所谓,只看它们的类型
。sum2
的每个参数在sum1
中都能找到对应的参数,所以允许赋值。let sum1 = (a: string, b: string => a + b; let sum2 = (a: string => a; sum1 = sum2;
举例:
Array#forEach
给回调函数传 3 个参数:item,index 和 array。 尽管如此,传入一个只使用第一个参数的回调函数也是可以的type Func<T> = (item: T, index: number, array: any[] => void; function forEach<T>(arr: T[], cb: Func<T> { for (let i = 0; i < arr.length; i++ { cb(arr[i], i, arr; } } forEach([1, 2, 3], (item => { console.log(item; };
返回值:
type sum1 = ( => string | number; type sum2 = ( => string; let fn1: sum1; let fn2!: sum2; fn1 = fn2;
四.类的兼容性
类与对象字面量和接口差不多,但有一点不同:类有静态部分和实例部分的类型。 比较两个类类型的对象时,只有实例的成员会被比较。 静态成员和构造函数不在