如何从TypeScript类型中安全提取字符串字面量类型的属性名?
解决TypeScript中提取属性名并保留字符串字面量类型的问题
现有方案能从TypeScript类型中安全提取属性名(编译阶段捕获输入错误),但提取的属性名类型为string而非对应属性名的字符串字面量,导致无法与Omit工具类型配合使用。示例代码如下:
function propertyOf<T>(name: keyof T) { return name; } type AB = {a: number, b: number}; const A = propertyOf<AB>('a'); // 预期构造类型 {b: number} type B_by_omit = Omit<AB, 'a'> // 符合预期,类型为{b: number} type B_by_omit2 = Omit<AB, typeof A> // 不符合预期,类型为{}
解决方案
通过给函数添加具体键的泛型约束,让返回值类型保留属性名的字符串字面量类型。修改后的函数如下:
function propertyOf<T, K extends keyof T>(name: K): K { return name; } // 或者更简洁的箭头函数写法 const propertyOf = <T, K extends keyof T>(name: K) => name;
验证效果
使用修改后的函数,提取的属性名会保留字面量类型,此时就能正常配合Omit使用:
type AB = {a: number, b: number}; const A = propertyOf<AB>('a'); // typeof A 的类型为 'a' type B_by_omit2 = Omit<AB, typeof A> // 符合预期,类型为{b: number}
这样既保留了编译阶段的类型检查(输入不存在的属性名会报错),又能让提取的属性名作为字面量类型参与后续的类型操作。
内容的提问来源于stack exchange,提问作者Marcus Junius Brutus
相关产品推荐
相关产品推荐

