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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 00:26:17