Typescript 为什么访问一个对象上的索引项不需要额外的操作?

Typescript 为什么访问一个对象上的索引项不需要额外的操作?,typescript,Typescript,这段代码为什么要编译 interface RotationDirection { polarity: number, } const d: RotationDirection = { polarity: 1, } console.log(d[0]); 如果我添加--noImplicitAny,它将因PipeGenerator而失败。ts:9:13-错误TS7053:元素隐式具有“any”类型,因为类型“0”的表达式不能用于索引类型“{polarity:number;}”。

这段代码为什么要编译

interface RotationDirection {
    polarity: number,
}

const d: RotationDirection = {
    polarity: 1,
}

console.log(d[0]);
如果我添加
--noImplicitAny
,它将因
PipeGenerator而失败。ts:9:13-错误TS7053:元素隐式具有“any”类型,因为类型“0”的表达式不能用于索引类型“{polarity:number;}”。
属性“0”在类型“{polarity:number;}”上不存在。


我不知道这怎么可能被推断为
任何
d
显然没有属性0,接口也没有属性0。

从历史上看,括号访问似乎是一个“后门”,当编译器不知道某个属性是否存在时,它允许对任意属性进行索引;见和

注意,在虚线访问和括号访问中,编译器推断未知属性的类型为
any

const any = d.notPresent; // unknown property error
// const any: any;
const alsoAny = d["notPresent"]; // implicitly any error
// const alsoAny: any;
这可能令人惊讶。问题在于,仅仅因为一个属性没有在对象类型上声明,并不意味着该属性肯定不存在;这只意味着编译器不知道它,如果它存在,它可能是任何东西。另一种说法是TypeScript中的对象类型不是。在这种情况下,类型为旋转方向的对象实际上可能具有键为0的属性:

因此编译器决定此类未声明属性的类型为
any


随着时间的推移,通过括号进入后门的问题会越来越少。启用
--strict
标志可以从编译器获得最大的类型安全性。由于
--strict
包含
--noImplicitAny
,因此访问未知属性的两种方法都会出现错误(当然,确切的错误消息会有所不同)

好的,希望能有帮助。祝你好运


对象字段的工作方式类似于数组,因此您可以迭代它们或与索引器一起使用,也就是说索引表达式抑制属性检查?
const weirdDirection = {
    polarity: 100,
    "0": true
};

const cloakedWeirdness: RotationDirection = weirdDirection; // no error