#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;