如何将 TypeScript 的索引访问类型与可为空的嵌套类型一起使用?

How to use TypeScript's indexed access types with nullable nested types?

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

这个有效:

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

type NestedData = Result['data']['nestedData'];

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

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

type NestedData = Result['data']['nestedData'];

并导致错误:

Property 'nestedData' does not exist on type '{ nestedData: { foo: string; bar: string; }; } | null'.(2339)

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

Demo on TypeScript Playground

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

您可以使用 Exclude 从联合中删除 null

type NestedData = Exclude<Result['data'], null>['nestedData']

Playground Link

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

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

获取可为空属性的通用实用程序:

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

type GetNullable<T, Prop extends keyof NonNullable<T>> = NonNullable<T>[Prop]

type NestedData = GetNullable<Result['data'], 'nestedData'>

Playground