TypeScript遍历interface属性时forEach报类型不兼容错误如何优化?
报错根因
TypeScript 默认会将字面量数组 ["foo", "bar"] 推断为 string[] 类型,而 string 是比 keyof A 更宽泛的类型,无法直接赋值给更窄的 keyof A 类型,因此触发参数类型不兼容的编译错误。
简洁解决方案
方案1:数组后直接加类型断言(最精简)
不需要单独声明变量,直接在数组后通过 as 标记类型,同时forEach的回调参数不需要额外写类型,TS会自动推断:
interface A { foo: string bar: string baz: string } function fn(obj: A) { (["foo", "bar"] as (keyof A)[]).forEach(prop => { obj[prop] // 执行业务逻辑 }) }
注意:该方案属于强制类型转换,如果数组内写入了不属于
A的属性名,TS不会提前报错,适合你确定数组内容完全正确的场景。
方案2:使用satisfies关键字(兼顾精简+类型安全,推荐TS≥4.9版本使用)
如果不想用强制断言,又要保证类型安全,用TS4.9新增的satisfies关键字,写错属性名时TS会直接在数组位置抛出错误:
function fn(obj: A) { (["foo", "bar"] satisfies (keyof A)[]).forEach(prop => { obj[prop] // 执行业务逻辑 }) }
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

