TypeScript工具类型NestedKeyOf开启严格模式时失效
TypeScript工具类型NestedKeyOf在strict模式下处理可选属性失效问题
我自定义了TypeScript工具类型NestedKeyOf,用来提取嵌套对象的键并转为点表示法字符串(比如"parent.child")。这个类型在tsconfig.json中设置"strict": false时可以正常工作,但开启"strict": true后,处理包含可选属性的对象时就会出错。
原类型定义
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;
示例代码
定义如下接口:
export interface Node { name: string; version?: string; ip_address?: IPAddress; } export interface IPAddress { ipv4?: string; ipv6?: string; };
期望以下代码可以编译通过,但在strict模式下会报错:
const nkn: NestedKeyOf<Node> = 'ip_address.ipv6';
问题原因
开启strict: true后,TypeScript会严格处理可选属性的类型——可选属性的类型是T | undefined。原类型中T[K] extends object的判断会因为undefined的存在不成立,导致无法递归生成嵌套的键路径。
修复方案
修改类型定义,先排除undefined和null,再判断是否为对象:
type NestedKeyOf<T> = T extends null | undefined ? never : T extends object ? { [K in keyof T & string]: | K | `${K}.${NestedKeyOf<NonNullable<T[K]>>}` }[keyof T & string] : never;
或者更严谨地处理基础类型(比如string、number等非对象类型不递归):
type NestedKeyOf<T> = T extends null | undefined ? never : T extends object ? { [K in keyof T & string]: T[K] extends null | undefined ? K : K | `${K}.${NestedKeyOf<T[K]>}` }[keyof T & string] : never;
修改后,即使在strict: true模式下,'ip_address.ipv6'也会被正确识别为NestedKeyOf<Node>的合法值。
内容的提问来源于stack exchange,提问作者Sai Satwik Kuppili
相关产品推荐
相关产品推荐

