返回列表

Typescript 好用 & 常用的高级特性

首先需要先简单了解下关于 mapset 的定义:

set 是无序无重复的集合,如:

type age = 18 | 19 | 20 | 21

map 类似对象,无重复的 kv 对,如:

interface People {
    sex : number;
    name: string;
}

将一个 map 所有属性变为可选的

type Partial<T> = { [P in keyof T]?: T[P] };

如上面的 People 在使用的时候都需要将其定义的字段都赋值, 当我们只需要修改或使用改定义都时候可使用 Partial 将其字段改为可选, 这样即可根据实际情况赋值其中某些字段

const user: Partial<People> = {
    "sex": 1
}

将一个 map 所有属性变为必填

type Required<T> = { [P in keyof T]-?: T[P] };

Partial 相反的操作,是将指定的 map 改为必填字段

interface People{
    sex?: number;
    name?: string;
}

const user:Required<People> = {
    "sex": 1
    , "name": "hehe"
}

将一个 map 所有属性变为只读的

type Readonly<T> = { readonly [P in keyof T]: T[P] };

定义一个通用的 map

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

当需要一个结构单一的 object 数据的时候,可以用 Record 简单定义

const host:Record<string, string> = {};

保留 map 的一部分

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

不想使用或返回某个 map 的时候可以使用 Pick 选择保留哪些 key, 适合在类型的 key 比较多的时候使用

/**配置 */
interface IConfig {
    enable: boolean;

    name:string;

    time:number;
}

// 对外只接收 IConfig 的 enable 项
function set(conf:Pick<IConfig, "enable">) {
    // balabala
}

删除 map 的一部分

type Omit<T, K> = Pick<T, Exclude<keyof T, K>>;

不想使用或返回某个 map 的时候可以使用 Omit 选择删除哪些 key, 适合在类型的 key 比较少的时候使用

/**配置 */
interface IConfig {
    enable: boolean;

    name:string;

    time:number;
}

// 对外只接收 IConfig 的 enable 项
function set(conf:Omit<IConfig, "name"|"time">) {
    // balabala
}

保留 set 的一部分

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

类似 Pick, 但作用于 set

删除 set 的一部分

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

类似 Omit, 但作用于 set

获取函数返回值的类型

ReturnType<typeof Function>;

在定义某些第三方或原生方法时非常好用,如:

const test = () => ({ "a": 1 });
type testReType = ReturnType<typeof Function>;

获取函数的入参数

Parameters<typeof a>

在定义函数入参的时候非常好用,不需要跑进去看这些参数具体是怎样的了,如:

function a(name:string, page:number) {}

type FunAParams = Parameters<typeof a>;

const aOne:FunAParams["0"] = "String";

获取类构造函数的型参

 ConstructorParameters<typeof ChatOpenAI>

在定义类构造函数入参的时候非常好用,有时候一些第三方库的类构造函数看的令人脑瓜子嗡嗡的,这时候使用 ConstructorParameters 来处理就特别合适,如:

type ClassACP = ConstructorParameters<typeof ChatOpenAI>;

// 直接使用 ChatOpenAI 构造函数的第一个参数
const modelOptions : ChatOpenAIParameters["0"] = {
    // ...
};

以下是 Typescript 本身没有的

可自行将类型实现放到项目中

将一个 map 所有属性变为可写的

type Mutable<T> = { -readonly [P in keyof T]: T[P] }