删除 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
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|