属性不存在时的Typescript编译-使用点vs使用方括号

时间:2018-08-23 14:07:55

标签: typescript tsc

假设我有以下课程和代码-

export class MyClass{
   a: number;
}
const o = new MyClass();
o.b = 5; // compile error. Property 'b' does not exist on type MyClass.
o['b'] = 5; // does compile.

使用点和使用方括号之间有什么区别。基本上是一样的,不是吗?

2 个答案:

答案 0 :(得分:4)

使用o['b']之类的括号时,会将o对象视为any对象,这意味着Typescript不会对其应用任何类型检查。

您可以通过在tsconfig.json文件中添加属性noImplicitAny: true来告诉它发出警告。这将导致o['b']出现Element implicitly has an 'any' type because type 'MyClass' has no index signature.错误。然后要解决此问题,您必须明确声明o应该被视为类似(o as any)['b']

一个例外是,如果您在MyClass中定义一个存在的属性。例如:

export class MyClass{
   a: number;
   "Weirdly-Named-Attribute": number;
}
const o = new MyClass();
o["a"] = 4; // compiles
o["Weirdly-Named-Attribute"] = 5; // compiles
o["b"] = 6; // Gives `Element implicitly has an 'any' type` error if `noImplicityAny` is enabled in tsconfig.

答案 1 :(得分:1)

o.b被编译器理解为:“我想初始化类b的此属性(在我们的情况下为MyClass)”。这就是为什么有一个编译错误。 但是o['b']在类型b的实例o中创建了一个新属性MyClass,因此可以编译。

因此,基本上,使用点和使用方括号之间的区别在于,点将尝试访问实例的所需属性,并且如果类中存在该属性,则将方括号分配给该属性。如果没有,它将创建属性并分配值。