请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

另一个Omit实现,但拿不到修饰符

图片描述大佬,咨询个问题,为什么在ts中使用pick类型,都可以获取到属性上的修饰符呢,比如可选或者readonly。我尝试另一种思路去实现Omit,但是拿不到修复符。希望老师解答下。

正在回答 回答被采纳积分+3

2回答

keviny79 2021-11-29 00:59:15

// 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 回复 有任何疑惑可以回复我~
  • 关于拿不到修饰符 Pick和Omit主要区别为 Pick<T, K extends keyof T>,而 Omit<T, K extends keyof any>,K的来源不一样,这样可以很好的解释为啥Omit的key拿不到修饰符了
    回复 有任何疑惑可以回复我~ 2022-01-28 11:03:57
keviny79 2021-11-29 01:02:21

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 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信