TypeScript 简单工具类型

TS utils simple

Posted by Eric on February 1, 2019

Pick

封装方式

type MyPick<T, K extends keyof T> = {
    [P in K]: T[P]
}

使用方式

interface Todo {
  title: string;
  description: string;
  completed: boolean;
}

type TodoPreview = Pick<Todo, "title" | "completed">;

const todo: TodoPreview = {
  title: "Clean room",
  completed: false,
};

readonly

封装方式

type MyReadonly<T> = {
    readonly [K in keyof T]: T[K]
}

使用方式

interface Todo {
  title: string;
}

const todo: Readonly<Todo> = {
  title: "Delete inactive users",
};

TupleToObject

type TupleToObject<T extends readonly string[]> = {
    [P in T[number]]: P
};

First

获取数组的第一个元素

type First<T extends any[]> = T['length'] extends 0 ? never : T[0]

Length

获取 tuple 的长度

type Length<T extends any[]> = T['length'];

Exclude

type MyExclude<T, U> = T extends U ? never : T;

使用

type T0 = Exclude<"a" | "b" | "c", "a">;
//    ^ = type T0 = "b" | "c"

Extract

type MyExtract<T, U> = T extends U ? T : never;

使用

type T0 = Extract<"a" | "b" | "c", "a" | "f">;
//    ^ = type T0 = "a"

Awaited

type Awaited<T> = T extends Promise<infer R> ? R : never;

If

type If<C extends boolean, T, F> = C extends true ? T : F;