interface Omit {
<T extends object, K extends [...(keyof T)[]]>
(obj: T, ...keys: K): {
[K2 in Exclude<keyof T, K[number]>]: T[K2]
}
}
const omit: Omit = (obj, ...keys) => {
let ret = {} as {
[K in keyof typeof obj]: (typeof obj)[K]
};
let key: keyof typeof obj;
for (key in obj) {
if (!(keys.includes(key))) {
ret[key] = obj[key];
}
}
return ret;
}
Для удобства я вытащил большинство набранных текстов в интерфейс.
Проблема заключалась в том, что 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
в объединение (для Exclude
его из keyof T
).Это сделано с K[number]
, что, я думаю, самоочевидно, это то же самое, что T[keyof T]
создание объединения значений T
.
Playground