首先需要先简单了解下关于 map
跟 set
的定义:
set 是无序无重复的集合,如:
type age = 18 | 19 | 20 | 21
map 类似对象,无重复的 kv 对,如:
interface People {
sex : number;
name: string;
}
type Partial<T> = { [P in keyof T]?: T[P] };
如上面的 People
在使用的时候都需要将其定义的字段都赋值, 当我们只需要修改或使用改定义都时候可使用 Partial
将其字段改为可选, 这样即可根据实际情况赋值其中某些字段
const user: Partial<People> = {
"sex": 1
}
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"
}
type Readonly<T> = { readonly [P in keyof T]: T[P] };
type Record<K extends keyof any, T> = { [P in K]: T };
当需要一个结构单一的 object 数据的时候,可以用 Record
简单定义
const host:Record<string, string> = {};
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
}
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
}
type Extract<T, U> = T extends U ? T : never;
类似 Pick
, 但作用于 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"] = {
// ...
};
可自行将类型实现放到项目中
type Mutable<T> = { -readonly [P in keyof T]: T[P] }