济南单位网站建设,新媒体如何运营推广,大连甘井子区,上海东道设计1. 条件类型表达式 T extends U ? X : Y 基本语法#xff1a; T extends U ? X : Y #xff08;T 和 U 是类型#xff0c;而 X 和 Y 是类型或者类型表达式。#xff09; 用于判断 T的每个成员 是否是 U 的子类型。如果是#xff0c;则返回 X#xff0c;否则返回 Y。最终…1. 条件类型表达式 T extends U ? X : Y 基本语法 T extends U ? X : Y T 和 U 是类型而 X 和 Y 是类型或者类型表达式。 用于判断 T的每个成员 是否是 U 的子类型。如果是则返回 X否则返回 Y。最终返回多个Y 联合的结果(never在联合类型中会被忽略) 1. 基本用法--判断类型
// 判断是不是字符串
type IsStringT T extends string ? true : false;
type Result1 IsStringstring; // true
//判断是不是数组
type isArrayT T extends Arrayany ? true : false
type testArray isArray123
判断是不是对象
type isObjectT T extends object true : false
type testObject isObject{a:123}
2. 提取元组的类型
type ArrayElementTypeT extends any[] T extends (infer U)[] ? U : never;
// 使用示例
const numbers: number[] [1, 2, 3];
type NumberElementType ArrayElementTypetypeof numbers; // number
3. 排除null或undefined的类型
type noNullT T extends null | undefined ? never : T
type Result1 noNullstring | null
4. 递归条件类型示例
type DeepArrayElementTypeT T extends any[] ? T[number] extends infer U ? U extends any[] ? DeepArrayElementTypeU : U : never : T; // 使用通用版本
type Example5 DeepArrayElementTypenumber[][][]; // number
type Example6 DeepArrayElementTypestring | number[][]; // string | number
6. 条件烈类型与泛型类型结合使用 条件表达式可以实现递归 // 只针对接口的递归
//实现一个泛型 DeepReadonlyT它将对象的每个参数及其子对象递归地设为只读。
type X {x: {a: 1;b: hi;};y: hey;
};type Expected {readonly x: {readonly a: 1;readonly b: hi;};readonly y: hey;
};type DeepReadonlyT {readonly [P in keyof T]: T[P] extends object ? DeepReadonlyT[P] : T[P];
};let zs: DeepReadonlyX {x: {a: 1,b: hi,},y: hey,
};
zs.x.b xc;infer infer 关键字用于在泛型条件类型中推断类型。它允许你声明一个类型变量该变量会在条件类型被解析时自动推断出具体的类型。 infer 关键字通常与条件类型和映射类型中的 extends 关键字一起使用但是infer 并不一定要与 extends 结合使用。 infer 可以在一个条件类型中多次使用以捕获不同的类型信息。 1. 提取数组元素类型
type ElementTypeT extends any[] T extends (infer U)[] ? U : never;
// 使用示例
type NumArrayElementType ElementType[1, 2, 3, 4]; // number
type MixedArrayElementType ElementType[1, two, true]; // number | two | true但通常这不是我们想要的
2. 提取数组最后一个元素类型
type arr1 [1, 2, 3]
type FirstElementT extends any[] T extends [...infer First, infer Rest] ? Rest : never;
type lastTest FirstElementarr1
3. 提取数组第一个元素类型
type arr2 [a, b, c]
type FirstElementT extends any[] T extends [infer First, ...infer Rest] ? First : never;
type firstTest FirstElementarr1
4. 提取函数参数类型
type FunctionParamsT extends (...args: any) any T extends (...args: infer P) any ? P : never;
type Params FunctionParams(a: string, b: number) void;
5. 提取对象属性值类型
type ValueTypeOfPropertyT, K extends keyof T T[K] extends (infer V) ? V : never;
type Obj { a: string; b: number;
};
type AType ValueTypeOfPropertyObj, a;
// AType 类型为 string
6. 提取函数返回类型
type FunctionReturnTypeT extends (...args: any) any T extends (...args: any) infer R ? R : never;
type ReturnType FunctionReturnType() string;
// ReturnType 类型为 string
7. 提取联合类型中的各个类型
8. 创建类型变换如数组转换成元组2. Exclude ExcludeT, U用于从类型 T 中排除所有可分配给类型 U 的成员。 type T0 Excludea | b | c, a | b; // c
type T2 Excludestring | number | (() void), Function; // string | number