跳到主要内容

泛型工具类型

typeof

interface Person {
name: string;
age: number;
}

const sem: Person = { name: 'semlinker', age: 33 };
type Sem= typeof sem; // -> Person

function toArray(x: number): Array<number> {
return [x];
}

type Func = typeof toArray; // -> (x: number) => number[]

keyof

操作符可以用于获取某种类型的所有键,其返回类型是联合类型。

interface Person {
name: string;
age: number;
}

type K1 = keyof Person; // "name" | "age"
type K2 = keyof Person[]; // "length" | "toString" | "pop" | "push" | "concat" | "join"
type K3 = keyof { [x: string]: Person }; // string | number

in

in 用来遍历枚举类型

type Keys = "a" | "b" | "c"

type Obj = {
[p in Keys]: any
} // -> { a: any, b: any, c: any }

infer

https://segmentfault.com/a/1190000018514540?utm_source=tag-newest

在extends语句中,还支持infer关键字,可以推断一个类型变量,高效的对类型进行模式匹配。但是,这个类型变量只能在true的分支中使用。

infer X 就相当于声明了一个变量,这个变量随后可以使用,在extends里用于去匹配赋值的类型。

infer 最早出现在此 PR 中,表示在 extends 条件语句中待推断的类型变量。

// infer P 表示待推断的函数参数。
type ParamType<T> = T extends (param: infer P) => any ? P : T;

如果 T 能赋值给 (param: infer P) => any,则结果是 (param: infer P) => any 类型中的参数 P,否则返回为 T。

interface User {
name: string;
age: number;
}

type Func = (user: User) => void

type Param = ParamType<Func>; // Param = User
type AA = ParamType<string>; // string

内置类型ReturnType就是用infer实现的

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

ReturnType<T> 只是将 infer P 从参数位置移动到返回值位置,因此此时 P 即是表示待推断的返回值类型。

type Func = () => User;
type Test = ReturnType<Func>; // Test = User