我想在普通的打字稿中复制lodash的_.omit函数.省略应该返回一个对象,该对象具有在首先出现的对象参数之后通过参数指定的某些属性.
这是我最好的尝试:
function omit
这给了我这个错误:
Argument of type 'keyof T' is not assignable to parameter of type 'K'.
Type 'string | number | symbol' is not assignable to type 'K'.
Type 'string' is not assignable to type 'K'.ts(2345)
let key: keyof T
我对错误的解释是:
>由于key是T的键,而T是对象,因此key可以是符号,数字或字符串.
>因为我使用for in循环,key只能是一个字符串,但是如果我传入一个数组,包括可能需要一个数字,例如?我认为.这意味着这里有类型错误?
任何有关为什么这不起作用以及如何使其工作的见解表示赞赏!
最佳答案
interface Omit {
为方便起见,我将大部分内容都放到了界面上.
问题是K一直在(正确时态?)推断为元组,而不是键的联合.因此,我相应地更改了它的类型约束:
[...(keyof T)[]] // which can be broke down to:
keyof T // a union of keys of T
(keyof T)[] // an array containing keys of T
[] // a tuple
[...X] // a tuple that contains an array X
然后,我们需要将元组K转换为union(以便从keyof T中排除它).用K [数字]完成,我猜是自我解释,它与T [keyof T]相同,创建了T值的并集.