如何将 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
类型的任何部分?
编辑:我从代码生成工具中获取我的 NestedData
类型,并将 NestedData
定义为较短的类型别名。实际上打字时间更长,所以我想尽量减少重复。
您可以使用 Exclude
从联合中删除 null
:
type NestedData = Exclude<Result['data'], null>['nestedData']
当您出于某种原因无法更改 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'>
我正在尝试根据另一种类型定义 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
类型的任何部分?
编辑:我从代码生成工具中获取我的 NestedData
类型,并将 NestedData
定义为较短的类型别名。实际上打字时间更长,所以我想尽量减少重复。
您可以使用 Exclude
从联合中删除 null
:
type NestedData = Exclude<Result['data'], null>['nestedData']
当您出于某种原因无法更改 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'>