如何在TypeScript中合法访问this的变量属性?
问题:移除TypeScript代码中的@ts-ignore并解决类型报错
当前有如下实现代码,运行时功能正常,但依赖@ts-ignore跳过类型检查:
setOps = (ops: Partial<Ops>) => { let key: keyof Ops; for (key in ops) { if (this.hasOwnProperty(key)) { // @ts-ignore this[key] = ops[key]; } } };
直接移除@ts-ignore后,TypeScript会抛出错误:
Type 'undefined' is not assignable to type 'never'.ts(2322)
希望找到无需忽略类型的实现方式,比如定义this的键类型或其他TypeScript认可的写法。
最小可复现代码
type Ops = { a: string; b: number; } class Tester { a: string; b: number; constructor(ops: Ops) { this.a = ops.a; this.b = ops.b; } setOps = (ops: Partial<Ops>) => { let key: keyof Ops; for (key in ops) { if (this.hasOwnProperty(key)) { // @ts-ignore this[key] = ops[key]; } } } } const tester = new Tester({a: 'a', b: 1}); console.log(tester.a, tester.b); tester.setOps({a: 'aa'}); console.log(tester.a, tester.b); tester.setOps({b: 2}); console.log(tester.a, tester.b);
解决方案
方案1:类型断言+存在性检查
通过判断ops[key]不为undefined,再用类型断言明确属性类型,消除类型不兼容问题:
setOps = (ops: Partial<Ops>) => { let key: keyof Ops; for (key in ops) { if (this.hasOwnProperty(key) && ops[key] !== undefined) { this[key] = ops[key] as Ops[keyof Ops]; } } };
方案2:泛型函数处理单个属性
用泛型让TypeScript推导每个键的具体类型,结合非空断言确保类型安全:
setOps = (ops: Partial<Ops>) => { const assignKey = <K extends keyof Ops>(key: K) => { if (this.hasOwnProperty(key) && ops[key] !== undefined) { this[key] = ops[key]!; } }; (Object.keys(ops) as Array<keyof Ops>).forEach(assignKey); };
方案3:使用Object.assign(最简洁)
利用Object.assign内置的类型支持,直接完成属性赋值,无需手动循环:
setOps = (ops: Partial<Ops>) => { Object.assign(this, ops); };
报错原因说明
原代码报错是因为:
Partial<Ops>的属性允许为undefined,但Tester类的属性是必填的(string/number,不能为undefined);- 循环中
key是keyof Ops的联合类型,TypeScript无法确定this[key]和ops[key]的具体类型是否完全匹配,导致类型推导冲突,最终抛出never类型的赋值错误。
内容的提问来源于stack exchange,提问作者era
相关产品推荐
相关产品推荐

