TS常见语法
Partial
partial作用是将传入的属性变为可选项
首先需要理解两个关键字keyof和in,keyof可以用来取得一个对象接口的所有key值。
interface Foo {
name: string;
age: number
}
type T = keyof Foo // -> 'name' | 'age'
而in可以遍历枚举类型
type Kesy = 'a' | 'b'
type Obj = {
[p in Keys]: any
} // -> { a: any, b: any }
keyof产生联合类型,in则可以遍历枚举类型,所以它们经常一起使用。
// Partial源码
type Partail<T> = { [P in keyof T]?: T[P] }
keyof T拿到T的所有属性名,然后in进行遍历,将值赋给P,最后T[P]取得对应的属性值。
Required
Required的作用是将传入的属性变为必选项
// Required 源码
type Required<T> = { [p in keyof T]-?: T[P] }
-?是将可选项?去掉,从而让类型变成必选项。与之对应的是+?,这含义与-?相反,是用来把属性变成可选项。
Mutable
对readonly进行加减
// Mutable 源码
type Mutable<T> = {
- readonly [P in keyof T]: T[P]
}
// 将T的所有属性的readonly移除
Readonly
将传入的属性变为只读项
type Readonly<T> = { readonly [P in keyof T]: T[P]}
Record
将K中所有的属性的值转化为T类型
type Record<K extends keyof any, T> = { [P in K]: T}
Pick
从T中取出一系列K的属性
type Pick<T, K extends keyof T> = { [P in K]: T[P]}
Exclude
在ts2.8中引入了一个条件类型,
T extends U ? X : Y
上面语句的意思:如果T是U的子类型,返回X,否则返回Y
可以多个组合
type TypeName<T> = {
T extends string ? 'string' :
T extends number ? 'number' :
T extends boolean ? 'boolean' :
T extends undefined ? 'undefined' :
T extends Function ? 'function' :
'object'
}
// Exclude源码
type Exclude<T, U> = T extends U ? never : T
// eg
type T = Exclude<1 | 2, 1 | 3> // ->2
Extract
Extract的作用是取出T中包含U中的元素
type Extract<T, U> = T extends U ? T : never
Omit(未包含)
用之前的Pick和Exclude进行组合,实现忽略对象某些属性功能
type Omit<T, K> = Pick<T, Exclude<keyof T, K>>
//eg
type Foo = Omit<{name: string, age: number}, 'name'> // -> { age: number }