開始逐漸體操化
先來看一些內(nèi)置的 TS 工具
type Person = { name: string; age: number; }
type X1 = Readonly<Person>
type X2 = Partial<Person>
type X3 = Required<Person>
type X4 = Record<string, number>
type X5 = Exclude<1 | 2 | 3, 1 | 2> // 3
type X6 = Extract<1 | 2 | 3, 2 | 4> // 2
type X7 = Omit<Person, 'name' | 'age'>
Readonly
type Readonly<T> = {
readonly [K in keyof T]: T[K]
}
關(guān)鍵詞
in
,而不是用:
屉更,上之前的文章種也提到過余指,in 多用于泛型
Partial
type Partial<T> = {
[K in keyof T]?: T[K]
}
Required
type Required<T> = {
[K in keyof T]-?: T[K]
}
Record
type Record<K extends string | number | symbol, V> = {
[key in K]: V
}
Exclude
type Exclude<T, K> = T extends K ? never : T
Extract
type Extract<T, K> = T extends K ? T: never
Omit
type Omit<T, K> = {
[K2 in keyof T as (K2 extends K ? never : K2)]: T[K2]
}
Pick
type Pick<T, K extends keyof T> = {
[K2 in keyof K]: T[K2]
}
這個(gè)時(shí)候在來實(shí)現(xiàn) Omit 更加簡單
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>
Mutable
type Mutable<T> = {
-readonly [K in keyof T]: T[K]
}
結(jié)論
理論上 TS 可以完成所有 JS 的功能
超牛的項(xiàng)目
象棋
https://github.com/chinese-chess-everywhere/type-chess
lisp 解釋器
型體操天花板