mewcoder / feroad

前端精进之路 网站
https://feroad.tech
4 stars 0 forks source link

TS面试题 #2

Open mewcoder opened 7 months ago

mewcoder commented 7 months ago
mewcoder commented 7 months ago

TypeScript 的优缺点

缺点:

mewcoder commented 7 months ago

interface 和 type

mewcoder commented 7 months ago

unknown / never / any / void

undefined 和 null 是所有类型的子类型,可赋值给其他类型;如果指定了 --strictNullChecks 标记,null 和 undefined 只能赋值给 void 和它们自己。

mewcoder commented 7 months ago

infer

infer可以在extends的条件语句中推断待推断的类型

infer R 的位置代表了一个未知的类型,可以理解为在条件类型中给了它一个占位符,然后就可以在后面的三元运算符中使用它。

type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;

mewcoder commented 7 months ago

协变和逆变

协变: 子类赋值给父类是安全的,因为子类上包含了父类所有的属性和方法;那么复合类型如何 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 才对函数参数类型进行逆变检查。

为什么函数参数是双向协变的?