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
作者
Reimu747
发布于
2021年3月15日
许可协议