Open mewcoder opened 7 months ago
缺点:
interface 是一种数据结构的描述,比如对象;interface 可以多次定义并能够合并,可以被类实现
type 是类型别名,是一种表达式;type 可以声明基本类型别名,联合类型,交叉类型、元组等类型,能进行类型编程
用 interface 描述数据结构,用 type 描述类型关系;个人是能用 interface 实现,就用 interface , 如果不能就用 type
undefined 和 null 是所有类型的子类型,可赋值给其他类型;如果指定了 --strictNullChecks 标记,null 和 undefined 只能赋值给 void 和它们自己。
infer可以在extends的条件语句中推断待推断的类型
infer R 的位置代表了一个未知的类型,可以理解为在条件类型中给了它一个占位符,然后就可以在后面的三元运算符中使用它。
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;
协变: 子类赋值给父类是安全的,因为子类上包含了父类所有的属性和方法;那么复合类型如何 Array、Promise 也遵循这种规则
let animal: Animal;
let dog: Dog;
animal = dog; // ✔
let animals: Array<Animal>;
let dogs: Array<Dog>;
animals = dogs; // ✔
逆变:作为函数参数时,处理父类的函数是可以赋值给处理子类的函数,因为传入的参数是子类,子类上包含了父类的所有属性和方法
let handleAnimal = (animal: Animal) => {};
let handleDog = (dog: Dog) => {};
handleAnimal = handleDog; // ❌
handleDog = handleAnimal; // ✔
双向协变:TS 类型系统允许函数参数是双向协变(bivariant
),这意味着参数可以被看作是协变或逆变的,这是出于实用性考虑的一个妥协。
只有开启了--strictFunctionTypes 或者--strict 模式,ts 才对函数参数类型进行逆变检查。