TypeScript中for..in循环变量类型为string而非keyof的解决方法
TypeScript遍历对象键时类型不匹配的解决方法
在TypeScript中使用for...in遍历对象键时,循环变量会被默认推断为string类型,而非目标对象的keyof类型,导致索引对象时出现类型错误。针对你给出的代码场景,有以下几种解决方式:
方法一:类型断言转换循环变量类型
直接将循环变量断言为目标类型的键类型,明确告诉TypeScript该变量是对象的合法键:
class Files { patches?: Data; website?: Data; github?: Data; } const files: Files = {}; for (const file in Files.prototype) { const key = file as keyof Files; if (files[key]) { console.log(files[key]); } }
方法二:先转换键数组类型再遍历
通过Object.keys提取键数组后,将其断言为keyof Files的数组类型,再用for...of遍历:
class Files { patches?: Data; website?: Data; github?: Data; } const files: Files = {}; const keys = Object.keys(Files.prototype) as Array<keyof Files>; for (const key of keys) { if (files[key]) { console.log(files[key]); } }
方法三:添加字符串索引签名(不推荐)
给类添加字符串索引签名,允许任意string类型的键索引对象,但这会丢失TypeScript的严格类型检查,仅在必要时使用:
class Files { patches?: Data; website?: Data; github?: Data; [key: string]: Data | undefined; } const files: Files = {}; for (const file in Files.prototype) { if (files[file]) { console.log(files[file]); } }
注意:如果你的需求是遍历
files实例自身的属性,而非类原型的属性,应将Files.prototype替换为files,避免遍历到类的内置属性。
内容的提问来源于stack exchange,提问作者Maciej Bledkowski
相关产品推荐
相关产品推荐

