另一个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>


1
1
zhangkaili
关于拿不到修饰符 Pick和Omit主要区别为 Pick,而 Omit,K的来源不一样,这样可以很好的解释为啥Omit的key拿不到修饰符了
2022-01-28
共1条回复

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];

}

不需纠结,记住老师的解释,就非常好了!


0
0

晋级TypeScript高手,成为抢手的前端开发人才

轻松驾驭 TypeScript 高级用法, 突破前端成长瓶颈

871 学习 · 425 问题

查看课程