2

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

这有效:

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

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

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

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)

如何在不重复任何部分的情况下根据 定义我的NestedData类型?ResultResult

TypeScript Playground 上的演示

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

4

2 回答 2

2

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

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

游乐场链接

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

type NestedData = { foo: string; bar: string }
type Result = { data: { nestedData: NestedData } | null }
于 2021-09-10T12:18:54.407 回答
2

用于获取可为空属性的通用工具:

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'>

操场

于 2021-09-10T12:19:56.050 回答