在 typescript 中,`for…in` 循环默认将迭代变量推断为 `string` 类型,导致无法安全索引具有明确键集合的对象(如类实例或字面量)。本文介绍如何通过显式类型声明将循环变量精准约束为 `keyof t`,实现类型安全的属性遍历。
TypeScript 的 for…in 语句在设计上主要用于遍历对象的可枚举属性名,但其类型系统出于兼容性与运行时不确定性考虑,默认将循环变量推断为 string,而非更精确的 keyof T。这会导致类型检查失败——尤其当目标对象没有字符串索引签名([key: string]: any)时,编译器会报错:Element implicitly has an ‘any’ type because expression of type ‘string’ can’t be used to index type ‘Files’。
根本原因在于:for…in 在运行时可能遍历到原型链上的任意可枚举属性(包括继承的、动态添加的),TypeScript 无法在编译期保证该 string 值一定属于某个特定类型的键集合。因此,它拒绝隐式下标访问,以防止运行时错误。
✅ 正确解法:分离声明与赋值,显式标注循环变量类型