在 typescript 中使用 `for..in` 遍历对象时,循环变量默认被推断为 `string` 类型,导致无法安全索引目标对象。本文介绍如何通过显式声明 `keyof typeof` 类型,实现类型精准、零错误的键遍历。
TypeScript 的 for..in 语句在类型推断上存在一个常见陷阱:它不会自动将迭代变量约束为被遍历对象的实际键类型,而是统一赋予 string 类型。这会导致在后续用该变量索引对象(如 files[file])时触发类型错误——因为 string 并不必然属于 Files 的有效键集合,TS 无法保证索引安全性。
以原始代码为例:
class Files {
patches?: Data;
website?: Data;
github?: Data;
}
const files: Files = {};
for (const file in Files.prototype) {
if (files[file]) { // ❌ 错误:'string' 不能用于索引 'Files'
console.log(files[file]);
}
}
此处 file 被推断为 string,而 Files 没有字符串索引签名([key: string]: any),因此编译失败。
✅ 正确解法是分离声明与赋值,显式将循环变量声明为精确的键类型: