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
相关产品推荐
相关产品推荐

