Извлечение определения типа с ненулевым значением из обнуляемого типа

#typescript #types #null #typescript-generics

#typescript #типы #null #typescript-дженерики

Вопрос:

Допустим, у меня есть следующий интерфейс, созданный внешним инструментом:

 interface Animals {
    turtle: { shellHardness: number };
    fox: { whatDidItSay: string } | null;
}
  

Я хотел бы определить (извлечь из Animals ) тип как для черепахи, так и для лисы, но без …| null для лисы. Это легко для черепахи, потому что нет null:

 type Turtle = Animals["turtle"];
  

Но как мне это сделать для fox? Я предполагал, что может быть какой-то ExtractNullable тип, который удалит возможность обнуления:

 type Fox = ExtractNullable<Animals, "fox">;
  

К сожалению, я не смог правильно определить ExtractNullable тип. Я попробовал следующее:

 type ExtractNullable<T, K extends keyof T> = T[K] extends null ? never : T[K];
  

… но это не сработало. TypeScript playground по-прежнему выдает мне, что Fox тип определяется как type Fox = { whatTheySaid: string; } | null вместо type Fox = { whatTheySaid: string; }

Возможно ли это? Что я понимаю неправильно?

Спасибо

Ответ №1:

Ненулевой<Тип>

 type Fox = NonNullable<Animals["fox"]>;
  

реализация:

 /**
 * Exclude null and undefined from T
 */
type NonNullable<T> = T extends null | undefined ? never : T;