另一个Omit实现,但拿不到修饰符
来源:10-24 【高级类型 Omit] 分解掌握Omit

进阶的前端小白
2021-11-28
大佬,咨询个问题,为什么在ts中使用pick类型,都可以获取到属性上的修饰符呢,比如可选或者readonly。我尝试另一种思路去实现Omit,但是拿不到修复符。希望老师解答下。
2回答
-
keviny79
2021-11-29
// 1
// 这是个很隐蔽且有些费解的问题, TS 官方给的答案线索也有点绕
// 先来看一个例子,自己上级测试下:
type Pratise<T, K extends keyof T> = {
[P in K]: P// 可以获取修饰符
}
type Result = Pratise<Todo, "title">
type Pratise2<T> = {// 获取不到修饰符
[P in "title"]: P
}
type Result2 = Pratise2<Todo>
112022-01-28 -
keviny79
2021-11-29
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>
/**
* 官方的答案在这句话里
* From T, pick a set of properties whose keys are in the union K
* 【从T中,选择一组位于联合K中的属性的键】,答案有点绕
*
* 其实,TS 是想告诉我们: [P in K ] 拿到的是一个普通字符Key 还是 T 中的 Key 取决于 K的上一步 的K是否是 K extends keyof T.
*/
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
};
type Omit2<T, K extends keyof T> = {
// TS 认为 Exclude<keyof T, K> 已经把解析成了一个联合类型,
// P in 仅仅是从一个普通的字符联合类型来迭代,key 已经 和T无关了, 自然获取到的是仅仅是一个字符串key了
[P in Exclude<keyof T, K>]: T[P];
}
不需纠结,记住老师的解释,就非常好了!
00
相似问题