| 删除 map 的一部分 type Omit<T, K> = Pick<T, Exclude<keyof T, K>>; /* {     default: number }  */ type DefaultSizeMap = Omit<BiggerSizeMap, 'big'>; 
 保留 set 的一部分 type Extract<T, U> = T extends U ? T : never;   type Result = 1 | 2 | 3 | 'error' | 'success'; type StringResult = Extract<Result, string>;    // 'error' | 'success 
 删除 set 的一部分 type Exclude<T, U> = T extends U ? never : T; type NumericResult = Exclude<Result, string>;    // 1 | 2 | 3 
 获取函数返回值的类型。但要注意不要滥用这个工具类型,应该尽量多手动标注函数返回值类型。理由开篇时提过, 契约高于实现 。用 ReturnType 是由实现反推契约,而实现往往容易变且容易出错,契约则相对稳定。另一方面,ReturnType 过多也会降低代码可读性。 type ReturnType<T> = T extends (...args: any[]) => infer R ?  R : any;   function f() { return { a: 3, b: 2}; } /* {     a: number     b: number }  */ type FReturn = ReturnType<f>; 
 以上这些工具类型都已经包含在了 TS 标准库中,在应用中直接输入名字进行使用即可。另外,在这些工具类型的实现中,出现了 infer、never、typeof 等关键字,在后文我会详细解释它们的作用。 类型的递归TS 原生的 Readonly 只会限制一层写入操作,我们可以利用递归来实现深层次的 Readonly。但要注意,TS 对最大递归层数做了限制,最多递归 5 层。 type DeepReadony<T> = {     readonly [P in keyof T]: DeepReadony<T[P]> }   interface SomeObject {   a: {     b: {       c: number;     };   }; }   const obj: Readonly<SomeObject> = { a: { b: { c: 2 } } }; obj.a.b.c = 3;    // TS不会报错   const obj2: DeepReadony<SomeObject> = { a: { b: { c: 2 } } }; obj2.a.b.c = 3;    // Cannot assign to 'c' because it is a read-only property. 
 never infer typeof 关键字never是|运算的幺元,即x | never = x。例如之前的 Exclude<Result, string> 运算过程如下:
 
 infer的作用是让 TypeScript 自己推断,并将推断的结果存储到一个临时名字中,并且只能用于 extends 语句中。它与泛型的区别在于,泛型是声明一个 “参数”,而 infer 是声明一个 “中间变量”。infer 我用得比较少,这里借用一下官方的示例。
 type Unpacked<T> =     T extends (infer U)[] ? U :     T extends (...args: any[]) => infer U ? U :     T extends Promise<infer U> ? U :     T;   type T0 = Unpacked<string>;  // string type T1 = Unpacked<string[]>;  // string type T2 = Unpacked<() => string>;  // string type T3 = Unpacked<Promise<string>>;  // string type T4 = Unpacked<Promise<string>[]>;  // Promise<string> type T5 = Unpacked<Unpacked<Promise<string>[]>>;  // string 
 (编辑:南平站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |