假设我有以下课程和代码-
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.
使用点和使用方括号之间有什么区别。基本上是一样的,不是吗?
答案 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
,因此可以编译。
因此,基本上,使用点和使用方括号之间的区别在于,点将尝试访问实例的所需属性,并且如果类中存在该属性,则将方括号分配给该属性。如果没有,它将创建属性并分配值。