TypeScript内置工具

229 阅读3分钟

Partial 将一个类型的属性全部变为可选

/**
 * Make all properties in T optional
 */
type Partial<T> = {
    [P in keyof T]?: T[P];
};

keyof遍历所有泛型T组成一个新的类型,然后将新类型的所有属性变为可选?

使用方法:

interface UserInfo {
    name: string;
    age: number;
    gender: number;
};

// 将UserInfo中的属性变为可选
const userInfo: Partial<UserInfo> = {
    name: '张三'
};

Required 将一个类型的属性全部变为必选

/**
 * Make all properties in T required
 */
type Required<T> = {
    [P in keyof T]-?: T[P];
};

Partial相反,在遍历所有泛型T后,将所得到的新类型的所有属性变为必选-?属性

使用方法:

interface UserInfo {
    id?: string | number;
    name: string;
    age: number;
};

// 将UserInfo中的属性变为必选
const userInfo: Required<UserInfo> = {
    id: '001', // 必选
    name: '张三',
    age: 20
};

Readonly 将一个类型的属性全部变为只读

/**
 * Make all properties in T readonly
 */
type Readonly<T> = {
    readonly [P in keyof T]: T[P];
};

遍历泛型T中的所有属性并将其转化为只读

使用方法:

interface UserInfo {
    id: string | number;
    name: string;
    age: number;
};

// 将UserInfo中的属性变为只读
const userInfo: Readonly<UserInfo> = {
    id: '001',
    name: '张三',
    age: 20
};

// error: 无法分配到 "name" ,因为它是只读属性。
userInfo.name = 'Lily';

Pick 从类型T中将所有的K取出来生成一个新的类型

/**
 * From T, pick a set of properties whose keys are in the union K
 */
type Pick<T, K extends keyof T> = {
    [P in K]: T[P];
};

从一个集合中挑选出指定的属性作为一个新的联合类型

使用方法:

interface UserInfo = {
    id: string | number;
    name: string;
    age: number;
};

const userInfo: Pick<UserInfo, 'name'> = {
    name: '张三',
    age: 20
};

// 张三
console.log(userInfo.name);

// error: 类型“Pick<UserInfo, "name">”上不存在属性“age”
console.log(userInfo.age);

Record 生成一个属性为K类型为T的类型集合

/**
 * Construct a type with a set of properties K of type T
 */
type Record<K extends keyof any, T> = {
    [P in K]: T;
};

使用方法:

interface UserInfo {
    id: string | number;
    name: string;
    age: number;
}

const userInfo: Record<string, T> = {
    person: {
        id: '001',
        name: '张三',
        age: 20
    }
};

Exclude 排除联合类型T中包含U的属性(差集:T - (T ∩ U))

/**
 * Exclude from T those types that are assignable to U
 */
type Exclude<T, U> = T extends U ? never : T;

排除两个联合类型中包含的公共部分

使用方法:

type Cat1 = 'Kitty' | 2;
type Cat2 = 'Lily' | 2;

type Cat = Exclude<Cat1, Cat2>;
// 等同于
type Cat = 'Kitty';

Extract 提取联合类型T中包含U的属性(交集:T ∩ U)

/**
 * Extract from T those types that are assignable to U
 */
type Extract<T, U> = T extends U ? T : never;

Exclude刚好相反,提取两个联合类型中的公共部分

使用方法:

type Cat1 = 'Kitty' | 2;
type Cat2 = 'Lily' | 2;

type Cat = Extract<Cat1, Cat2>;
// 等同于
type Cat = 2;

Omit 用来忽略T中包含的K属性构造一个新的对象

/**
 * Construct a type with the properties of T except for those in type K.
 */
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;

使用方法:

interface UserInfo = {
    id: string | number;
    name: string;
    age: number;
};

// userInfo中只包含 name 和 age 属性
const userInfo: Omit<UserInfo, 'id'> = {
    name: '张三',
    age: 20
};

NonNullable 从类型T中排除null和undefined构造一个新的对象

/**
 * Exclude null and undefined from T
 */
type NonNullable<T> = T extends null | undefined ? never : T;

使用方法:

type UserInfo = '张三' | undefined | null;

// userInfo中包含的可选的值为 '张三'
const userInfo: NonNullable<UserInfo> = '张三';

ReturnType 获取函数类型的返回类型

/**
 * Obtain the return type of a function type
 */
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;

使用方法:

const userInfo: ReturnType<() => string> = 'string'; // string
const userInfo: ReturnType<() => number> = 1; // number

Uppercase 将字符串文字类型转换为大写

/**
 * Convert string literal type to uppercase
 */
type Uppercase<S extends string> = intrinsic;

使用方法:

type Message = 'Hello, World~';

type Msg = Uppercase<Message>;
// 等同于
type Msg = 'HELLO, WORLD~';

Lowercase 将字符串文字类型转换为小写

/**
 * Convert string literal type to lowercase
 */
type Lowercase<S extends string> = intrinsic;

使用方法:

type Message = 'Hello, World~';

type Msg = Lowercase<Message>;
// 等同于
type Msg = 'hello, world~';

Capitalize 将字符串文字类型首字母转为大写

/**
 * Convert first character of string literal type to uppercase
 */
type Capitalize<S extends string> = intrinsic;

使用方法:

type Message = 'hello, world~';

type Msg = Capitalize<Message>;
// 等同于
type Msg = 'Hello, world~';

Uncapitalize 将字符串文字类型首字母转为小写

/**
 * Convert first character of string literal type to lowercase
 */
type Uncapitalize<S extends string> = intrinsic;

使用方法:

type Message = 'Hello, World~';

type Msg = Uncapitalize<Message>;
// 等同于
type Msg = 'hello, World~';

ThisType

/**
 * Marker for contextual 'this' type
 */
interface ThisType<T> { }

参考文档 typescript/lib/lib.es5.d.ts