开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情
其他公共内置类型映射
- Required 构建一个由Type的所有属性组成的类型,设置为必填,与Partial相反 假设有一个Person类型,其name属性是可选的,但是需要把属性都改成必填,就可以使用Required类型,
interface Person {
name?: string;
age: number;
}
type MyRequired<T> = {
[P in keyof T]-?: T[P]
}
type Res = Required<Person>
- Omit<type,key> 通过从Type中选取所有属性,然后删除keys(属性名或属性名的联合)来构造一个类型
Omit和Pick是相反的,Pick是挑出第二个联合类型的属性,Omit是去掉第二个联合类型的属性 Omit和 Exclude有几分类似,不过,Exclude是在联合类型中干掉某些联合类型,而Omit是在属性干掉一些。他的源码中是需要用Exclude配合一下的
interface Person {
name?: string;
age: number;
}
type MyOmit<T, K extends string | number | symbol> = {
[P in Exclude<keyof T, K>]: T[P]
}
type res = MyOmit<Person, 'name'>
type res2 = Pick<Person, 'name'>
- OmitThisParameter 从类型T中删除this参数类型,构造一个新类型
这个方法有点难理解,首先定义一个f0函数,源码是这样搞的,如果参数this的类型是any或者unknown类型就不会干掉,也就是unknown不继承的类型才干掉,否则不干掉。干掉时只是 T extends (...arg: infer N) => infer P ? (...arg: N) => P : T,如果是函数,那么就是这个函数类型,这样转换一下,this就没了,如果不是函数,就返回这个类型本身。
function f0(this: object, x: number) {
return x;
}
type MyOmit<T> = unknown extends ThisParameterType<T> ? T : T extends (...arg: infer N) => infer P ? (...arg: N) => P : T;
type Param = ThisParameterType<typeof f0>
type T1 = MyOmit<typeof f0>
根据我们的分析,直接写一个MyOmit类型,效果和它内置的表现行为一致。有this参数类型为object的干掉了this参数,非函数类型string,返回了string类型
function add(num: number) {
console.log(num)
return num;
}
function f0(this: object, x: number) {
return x;
}
function f1(x: number) {
return x;
}
type MyOmit<T> = unknown extends ThisParameterType<T> ? T : T extends (...arg: infer N) => infer P ? (...arg: N) => P : T;
type T1 = OmitThisParameter<typeof f0>
type T2 = OmitThisParameter<typeof f1>
type T3 = OmitThisParameter<string>
const res1: T1 = add;
const res2: T2 = add;
const res3: T3 = '字符串'
type MyT1 = OmitThisParameter<typeof f0>
type MyT2 = OmitThisParameter<typeof f1>
type MyT3 = OmitThisParameter<string>
const myRes1: T1 = add;
const myRes2: T2 = add;
const myRes3: T3 = '字符串'
ts里面还是包含很多js思想,仔细研究一下不得不感叹,非常巧妙啊。