Как написать 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, ведь я просто перенёс логику из промежуточного типа в, грубо говоря цикл.

Playground


Ответы (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]
}

В качестве ключа необходимо передавать не обобщённый тип, кортеж ключей.

→ Ссылка