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

TypeScript中ES6类getter的类型及循环attr的正确类型问题

问题1:TypeScript中ES6类的getter的类型是什么?

在TypeScript里,类的getter的类型就是其返回值的类型,同时getter在类型系统中会被标记为只读属性——因为它只有获取逻辑,没有对应的set方法,所以无法对其赋值。

比如你示例里的hasFoo getter:

get hasFoo(): boolean {
  return this.foo === true;
}

它的类型就是boolean,在类型检查时,mgr.hasFoo会被当作只读的boolean属性处理。


问题2:批量测试getter时,attr的正确类型是什么?

首先要纠正一个逻辑问题:你用Object.getOwnPropertyNames(mgr)遍历的是实例自身的属性(比如类里的私有属性foo、bar),而hasFoo这类getter是定义在类的原型上的访问器属性,所以这个方法拿不到你要测试的getter名称。正确的做法是遍历类的原型属性,再过滤掉不需要的constructor。

针对TypeScript的类型错误,你需要把attr的类型限定为WidgetsManager的合法键类型keyof WidgetsManager,具体有两种实现方式:

方式1:类型断言

直接把遍历到的字符串断言为keyof WidgetsManager:

// 获取原型上的所有属性名,排除constructor
const getterKeys = Object.getOwnPropertyNames(WidgetsManager.prototype).filter(name => name !== 'constructor');

getterKeys.forEach((attr) => {
  // 断言attr是WidgetsManager的合法键
  const key = attr as keyof WidgetsManager;
  expect(mgr[key]).toBeTruthy();
});

方式2:类型守卫(更严谨)

自定义类型守卫来确保遍历的字符串确实是类的合法键:

function isWidgetsManagerKey(key: string): key is keyof WidgetsManager {
  return key in mgr;
}

Object.getOwnPropertyNames(WidgetsManager.prototype)
  // 过滤出属于WidgetsManager的键
  .filter(isWidgetsManagerKey)
  .forEach(attr => {
    expect(mgr[attr]).toBeTruthy();
  });

这样就能解决TS7053类型错误,同时正确遍历到所有需要测试的getter属性。


内容的提问来源于stack exchange,提问作者Andrew Allison

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 16:42:49