如何将对象中名称带?的键转为可选属性类型?
TypeScript类型转换:将键名带问号的属性转为可选属性
问题描述
给定对象及对应类型:
const obj = { a: 1, "b?": 2, "c?": 3 } type OriginalObj = { a: number; "b?": number; "c?": number; }
需要实现一个类型工具,将上述类型转换为:
type TransformedObj = { a: number; b?: number; c?: number; }
核心是把键名包含?的属性,转为可选属性并移除键名中的问号。
实现代码
可以通过映射类型结合模板字面量类型完成转换:
// 移除键名末尾的问号 type RemoveTrailingQuestion<K extends string> = K extends `${infer Name}?` ? Name : K; // 核心转换类型 type TransformObj<T> = { [K in keyof T as RemoveTrailingQuestion<K>]: K extends `${infer _}?` ? T[K] | undefined : T[K]; }; // 测试验证 type OriginalObj = { a: number; "b?": number; "c?": number; }; type TransformedObj = TransformObj<OriginalObj>; // 转换后 TransformedObj 的类型为: // { // a: number; // b?: number | undefined; // c?: number | undefined; // }
逻辑说明
RemoveTrailingQuestion:利用模板字面量类型匹配以?结尾的键名,提取出不带问号的属性名。TransformObj:- 遍历原类型的所有键,通过
as RemoveTrailingQuestion<K>重命名键名; - 对原键名带
?的属性,将其类型设置为原类型 | undefined,效果等价于TypeScript的可选属性语法?。
- 遍历原类型的所有键,通过
内容的提问来源于stack exchange,提问作者tdranv
相关产品推荐
相关产品推荐

