You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 05:57:03