1. 条件类型表达式 T extends U ? X : Y
1. 基本用法--判断类型
type IsString<T> = T extends string ? true : false;
type Result1 = IsString<string>;
type isArray<T> = T extends Array<any> ? true : false
type testArray = isArray<'123'>
判断是不是对象
type isObject<T> T extends object > true : false
type testObject = isObject<{a:'123'}>
2. 提取元组的类型
type ArrayElementType<T extends any[]> = T extends (infer U)[] ? U : never;
const numbers: number[] = [1, 2, 3];
type NumberElementType = ArrayElementType<typeof numbers>;
3. 排除null或undefined的类型
type noNull<T> = T extends null | undefined ? never : T
type Result1 = noNull<string | null>
4. 递归条件类型示例
type DeepArrayElementType<T> =
T extends any[]
? T[number] extends infer U
? U extends any[]
? DeepArrayElementType<U>
: U
: never
: T;
type Example5 = DeepArrayElementType<number[][][]>;
type Example6 = DeepArrayElementType<string | number[][]>;
6. 条件烈类型与泛型类型结合使用
type X = {
x: {
a: 1;
b: "hi";
};
y: "hey";
};
type Expected = {
readonly x: {
readonly a: 1;
readonly b: "hi";
};
readonly y: "hey";
};
type DeepReadonly<T> = {
readonly [P in keyof T]: T[P] extends object ? DeepReadonly<T[P]> : T[P];
};
let zs: DeepReadonly<X> = {
x: {
a: 1,
b: "hi",
},
y: "hey",
};
zs.x.b = "xc";
infer
1. 提取数组元素类型
type ElementType<T extends any[]> = T extends (infer U)[] ? U : never;
type NumArrayElementType = ElementType<[1, 2, 3, 4]>;
type MixedArrayElementType = ElementType<[1, "two", true]>;
2. 提取数组最后一个元素类型
type arr1 = [1, 2, 3]
type FirstElement<T extends any[]> =
T extends [...infer First, infer Rest] ? Rest : never;
type lastTest = FirstElement<arr1>
3. 提取数组第一个元素类型
type arr2 = ['a', 'b', 'c']
type FirstElement<T extends any[]> =
T extends [infer First, ...infer Rest] ? First : never;
type firstTest = FirstElement<arr1>
4. 提取函数参数类型
type FunctionParams<T extends (...args: any) => any> = T extends (...args: infer P) => any ? P : never;
type Params = FunctionParams<(a: string, b: number) => void>;
5. 提取对象属性值类型
type ValueTypeOfProperty<T, K extends keyof T> = T[K] extends (infer V) ? V : never;
type Obj = {
a: string;
b: number;
};
type AType = ValueTypeOfProperty<Obj, 'a'>;
6. 提取函数返回类型
type FunctionReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : never;
type ReturnType = FunctionReturnType<() => string>;
7. 提取联合类型中的各个类型
8. 创建类型变换(如数组转换成元组)
2. Exclude
type T0 = Exclude<"a" | "b" | "c", "a" | "b">;
type T2 = Exclude<string | number | (() => void), Function>;
3. Uppercase
type Greeting = "hello";
type UppercaseGreeting = Uppercase<Greeting>;