带点符号的 TypeScript 实用程序类型 NestedKeyOf 在严格模式下失败
优质博文:IT-BLOG-CN
问题
我正在使用自定义 TypeScript 实用程序类型NestedKeyOf将嵌套键提取为点分符号字符串,例如。该类型在 中"parent.child"按预期工作,但启用会导致问题,尤其是可选属性。“strict”: falsetsconfig.json"strict": true
这是我的NestedKeyOf类型定义:
type NestedKeyOf<T> = T extends object
? {
[K in keyof T & string]: T[K] extends object
? K | `${K}.${NestedKeyOf<T[K]>}`
: K;
}[keyof T & string]
: never;
我正在使用自定义 TypeScript 实用程序类型NestedKeyOf将嵌套键提取为点分符号字符串,例如。该类型在 中"parent.child"按预期工作,但启用会导致问题,尤其是可选属性。“strict”: falsetsconfig.json"strict": true
这是我的NestedKeyOf类型定义:
type NestedKeyOf<T> = T extends object
? {
[K in keyof T & string]: T[K] extends object
? K | `${K}.${NestedKeyOf<T[K]>}`
: K;
}[keyof T & string]
: never;
在 Angular 编译期间,此类型按预期工作,当在中"strict": false设置时angularCompilerOptionstsConfig.json
示例代码:
以下是具有以下类型的示例:
export interface Node {
name: string;
version?: string;
ip_address?: IPAddress;
}
export interface IPAddress {
ipv4?: string;
ipv6?: string;
};
我期望`下代码能够编译:
const nkn: NestedKeyOf<Node> = 'ip_address.ipv6';
解决方案
您需要将对象标记为具有所有必需的键。例如,如果ip_address是可选的,则其值是IPAddress | undefined,它不是的子集object:
type T = Node[‘ip_address’] extends object ? true : false // false
因此,您需要使所有对象键都成为必需的,以便深入了解子对象:
const nkn: NestedKeyOf<Node> = 'ip_address.ipv6'
export interface Node {
name: string;
version?: string;
ip_address?: IPAddress;
}
export interface IPAddress {
ipv4?: string;
ipv6?: string;
}
type NestedKeyOf<T extends object, R extends Required<T> = Required<T>> = keyof {
[K in keyof R & string as R[K] extends object ? K | `${K}.${NestedKeyOf<R[K]>}` : K]: any
}