Typescript
let obj = { a: "hey", b: "you", c: "guys" };
for (const k in obj) {
console.log(obj[k].toUpperCase()); // error!
/* Element implicitly has an 'any' type because expression of type
'string' can't be used to index type '{ a: string; b: string; c: string; }'. */
}
这里的问题是 TypeScript 中的对象类型是开放的或可扩展的,而不是封闭的或精确的。您可以在 TypeScript 中为对象添加额外的属性,而不会违反其类型。这在某些情况下非常有用:它允许您通过添加属性来扩展接口和子类。但在其他情况下,这是一种痛苦:
编译器将 obj 视为 {a: string, b: string, c: string} 类型的值。由于这种类型并不精确,当你执行 for (const k in obj) 时,编译器知道 k 将采用值“a”、“b”和“c”,但它不知道这些是唯一可能的值:
让 hmm = { a: "hey", b: "you", c: "guys", d: 12345 };
object= hmm ; // no error!
因为值 hmm 匹配 {a: string, b: string, c: string}。 d 属性不违反类型。因此,对于所有编译器都知道的,for (const k in obj) 将枚举“a”、“b”、“c”,谁知道还有哪些其