TypeScript全面指南(五)
TypeScript 类型编程
内置类型工具
// 属性修饰类型
type Partial<T> = {
[P in keyof T]+?: T[P];
};
type Required<T> = {
[P in keyof T]-?: T[P];
};
type Readonly<T> = {
readonly [P in keyof T]: T[P];
};
// 结构工具类型
type Record<K extends keyof any, T> = {
[P in K]: T;
};
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
};
type Omit<T, K extends keyof T> = {
[P in keyof T as P extends K ? never : P]: T[P];
};
// 集合工具类型
// 并集
type Concurrence<A, B> = A | B;
// 交集
type Intersection<A, B> = A extends B ? A : never;
// 差集
type Difference<A, B> = A extends B ? never : A;
// 补集
type Complement<A, B extends A> = Difference<A, B>;TypeScript 类型体操
// 特殊类型
// isAny
// any 类型与任何类型的交叉都是 any,也就是 1 & any 结果是 any。
type isAny<T> = 0 extends 1 & T ? true : false;
// isNever
type isNever<T> = [T] extends [never] ? true : false;
// isUnion
// 利用分布式条件类型,判断 A 是否是联合类型。
type IsUnion<A, B = A> = A extends A ? ([B] extends [A] ? false : true) : never;
// isEqual
type IsEqual<A, B> = (<T>() => T extends A ? 1 : 2) extends <T>() => T extends B ? 1 : 2 ? true : false;
// 递归复用
// 构建数组
type BuildArray<Length extends number, Arr extends unknown[] = []> = Arr['length'] extends Length
? Arr
: BuildArray<Length, unknown, [...Arr, unknown]>;
// 通过元组 length 计数
// 加
type Add<Num1 extends number, Num2 extends number> = [...BuildArray<Num1>, ...BuildArray<Num2>]['length'];
// 减
type Subtract<Num1 extends number, Num2 extends number> = BuildArray<Num1> extends [
...arr1: BuildArray<Num2>,
...arr2: infer Rest
]
? Rest['length']
: never;
// 乘
type Mutiply<Num1 extends number, Num2 extends number, ResultArr extends unknown[] = []> = Num2 extends 0
? ResultArr['length']
: Mutiply<Num1, Subtract<Num2, 1>, [...BuildArray<Num1>, ...ResultArr]>;
// 除
type Divide<Num1 extends number, Num2 extends number, CountArr extends unknown[] = []> = Num1 extends 0
? CountArr['length']
: Divide<Subtract<Num1, Num2>, Num2, [unknown, ...CountArr]>;类型体操题库
https://github.com/type-challenges/type-challenges/blob/main/README.zh-CN.md
TypeScript全面指南(五)
https://www.reimu747.ink/post/20210315.html