TypeScript中判断对象含指定键且无需类型转换使用该键的方法
问题解决方法
问题根因
TypeScript 类型系统默认不会对 in 操作符的左操作数做自动类型收窄:因为运行时对象可能包含类型定义外的额外属性,所以即使写了showDialog in show的判断,TS也不会默认将showDialog的类型从string收窄为keyof typeof show。
最优解决方案:实现通用类型守卫
写一个可复用的类型守卫函数,通过类型谓词明确告知TS类型校验规则:
// 通用类型守卫,可复用在所有类似键判断场景 function isKeyOf<T extends object>(target: T, key: unknown): key is keyof T { return typeof key === 'string' && Object.prototype.hasOwnProperty.call(target, key); }
改造后的业务代码不需要任何强制类型转换,TS可以自动完成类型推断:
let show = { createTag: false, updateFeature: false, createFeatureGroup: false, deleteFeature: false, deleteCycle: false, }; const showDialog = $page.query.get('show') || ''; if (isKeyOf(show, showDialog)) { // 此处TS已自动识别showDialog为show的合法键,无类型报错 show[showDialog] = true; }
轻量替代方案
如果不想额外引入工具函数,你原本的写法本身也是符合类型安全的,仅需要写一次强制断言即可,不会带来运行时风险。
内容的提问来源于stack exchange,提问作者opensas
相关产品推荐
相关产品推荐

