如何将 TypeScript 的索引访问类型与可为 null 的嵌套类型结合使用?

ruo*_*ola 9 typescript nullability

我正在尝试根据另一种类型定义 TypeScript 类型。

这有效:

type Result = { data: { nestedData: { foo: string; bar: string } } };

type NestedData = Result['data']['nestedData'];
Run Code Online (Sandbox Code Playgroud)

但是,当data属性可为空时,这不起作用:

type Result = { data: { nestedData: { foo: string; bar: string } } | null };

type NestedData = Result['data']['nestedData'];
Run Code Online (Sandbox Code Playgroud)

并导致错误:

type Result = { data: { nestedData: { foo: string; bar: string } } };

type NestedData = Result['data']['nestedData'];
Run Code Online (Sandbox Code Playgroud)

如何根据 定义我的NestedData类型,而不重复 的类型Result的任何部分?Result

TypeScript Playground 上的演示

编辑:我NestedData从代码生成工具获取类型,并将其定义NestedData为较短的类型别名。事实上,打字时间较长,所以我想尽量减少重复。

kay*_*ya3 8

您可以使用NonNullable从联合中删除null( 和):undefined

type NestedData = NonNullable<Result['data']>['nestedData']
Run Code Online (Sandbox Code Playgroud)

游乐场链接

等效地,但更详细一点,您可以使用Exclude

type NestedData = Exclude<Result['data'], null>['nestedData']
Run Code Online (Sandbox Code Playgroud)

游乐场链接

Result当您由于某种原因无法更改类型时,采用其中一种方法是有意义的。在其他情况下,这样定义它们会更自然:

type NestedData = { foo: string; bar: string }
type Result = { data: { nestedData: NestedData } | null }
Run Code Online (Sandbox Code Playgroud)