Как написать Omit без промежуточного типа
type MyExclude<T, K> = T extends K ? never : T
type MyOmit<T, K extends keyof T> = {
[Key in MyExclude<keyof T, K>]: T[Key]
}
// Так тоже работает
type MyOmitAs<T, K extends keyof T> = {
[Key in keyof T as MyExclude<keyof T, K>]: T[Key]
}
// type MyOmit<T, K extends keyof T> = {
// [Key in keyof T as keyof T extends K ? never : T]: T[Key]
// }
// type MyOmit<T, K extends keyof T> = {
// [Key in keyof T extends K ? never : T]: T[Key]
// }
Не понимаю, почему не работают закомментированные варианты, но или хотя бы вариант с as, ведь я просто перенёс логику из промежуточного типа в, грубо говоря цикл.
Ответы (1 шт):
Автор решения: doox911
→ Ссылка
Ответ дан captain-yossarian, но публикуется мной.
// @captain-yossarian
type MyOmit3<T, K extends keyof T> = {
[Key in keyof T as keyof T extends K ? never : keyof T]: T[Key]
}
В качестве ключа необходимо передавать не обобщённый тип, кортеж ключей.