# TypeScript 面试

# type 和 interface 的差别

type: 类型别名 interface: 接口

  1. 定义类型范围 interface 只能定义对象类型 type 可以声明任何类型;
  2. 都支持拓展, 但是写法不一样 interface 使用 extends, type 使用符号 &
interface Name {
  age: number
}

type Sex {
  gender: string
}
// interface 继承interface
interface Person extends Name {
  name: string
}
// interface继承type
interface Person extends Sex {
  name: string
}
// type继承interface
type PP = Name & { name: string }
// type继承type
type Phone { mo: number }

type People = Sex & { name: string }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  1. interface 可以声明合并
interface User {
  name: string
}
interface User {
  age: number
}

/**
 * User接口为 {
 * name: string
 * age: number
 * }
 * /
1
2
3
4
5
6
7
8
9
10
11
12
13

# 总结

能用 interface 优先使用 interface, 如果不能就用 type;

# infer

点开

infer 的作用一言蔽之:推导泛型参数

type numberPromise = Promise<number>;
type n = numberPromise extends Promise<infer P> ? P : never; // number
1
2

Promise 输入了 number 获得一个新的类型,那么 infer 就可以通过已知的类型和获得它泛型反推出泛型参数

还有注意一点,infer 只能在 extends 的右边使用,infer P 的 P 也只能在条件类型为 True 的一边使用,下文会讲解这个限制的意义。

type getIntersection<T> = T extends (a: infer P,b: infer P) => void ? P : never;
type Intersection = getIntersection<(a: string, b: number)=> void> // string & number
1
2

因为(a: string, b: number)=> void extends (a: infer P,b: infer P) => void,所以(a: string, b: number)=> void(a: infer P,b: infer P) => void 子类型,所以 P 到 string 或者 number 是逆变,然而我们这里是反过来推 P,所以 string 或 number 到 P 是协变,最终就推出 string & numner

  • 协变:类型推导到其子类型的过程,A | B -> A & B 就是一个协变
  • 逆变:类型推导到其超类型的过程
Last Updated: 10/20/2023, 4:38:44 PM