如何在TypeScript映射类型中无需判断字符串键实现链式键?
嵌套对象的点连接键类型生成方案
TypeScript 4.x 解决方案
要避免每次添加key extends string ? ... : never的判断,你可以在遍历对象键时直接筛选出string类型的键——依赖泛型约束T extends Record<string, any>无法完全解决问题,因为TypeScript允许对象包含额外的symbol/number键。
实现代码如下:
type NestedKeys<T> = T extends object ? { [K in Extract<keyof T, string>]: `${K}` | `${K}.${NestedKeys<T[K]>}` }[Extract<keyof T, string>] : never;
测试示例
type TestObject = { a: { b: 'c' }, d: 'asdf', [Symbol('test')]: number // 自动排除symbol键 }; type ResultKeys = NestedKeys<TestObject>; // 结果:'a' | 'a.b' | 'd'
通过Extract<keyof T, string>直接获取对象中所有string类型的键,遍历过程中无需额外判断键的类型,自然避免了symbol类型导致的报错。
TypeScript 5.x 优化写法
TS5.x支持在映射类型中使用as子句直接过滤键,写法更直观,逻辑和TS4的方案一致:
type NestedKeys<T> = T extends object ? keyof { [K in keyof T as K extends string ? K : never]: `${K}` | `${K}.${NestedKeys<T[K]>}` } : never;
该写法同样会自动排除非string类型的键,不需要额外的分支判断。
内容的提问来源于stack exchange,提问作者Sergio Tx
相关产品推荐
相关产品推荐

