从可为空类型中提取不可为空类型定义

vas*_*kch 2 null types typescript typescript-generics

假设我有一个由外部工具生成的以下界面:

\n
interface Animals {\n    turtle: { shellHardness: number };\n    fox: { whatDidItSay: string } | null;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我想Animals为乌龟和狐狸定义(从中提取)类型,但不\xe2\x80\xa6| null为狐狸定义类型。这对乌龟来说很容易,因为没有 null:

\n
type Turtle = Animals["turtle"];\n
Run Code Online (Sandbox Code Playgroud)\n

但我该如何为狐狸做这件事呢?我想象可能有某种ExtractNullable类型可以消除可为空性:

\n
type Fox = ExtractNullable<Animals, "fox">;\n
Run Code Online (Sandbox Code Playgroud)\n

不幸的是我无法ExtractNullable正确定义类型。我尝试了以下方法:

\n
type ExtractNullable<T, K extends keyof T> = T[K] extends null ? never : T[K];\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x80\xa6但它不起作用。TypeScript Playground 仍然告诉我类型Fox被定义为type Fox = { whatTheySaid: string; } | null而不是type Fox = { whatTheySaid: string; }

\n

这可能吗?我错了什么?

\n

谢谢

\n

Nik*_*eev 7

不可空<类型>

type Fox = NonNullable<Animals["fox"]>;
Run Code Online (Sandbox Code Playgroud)

执行:

/**
 * Exclude null and undefined from T
 */
type NonNullable<T> = T extends null | undefined ? never : T;
Run Code Online (Sandbox Code Playgroud)