Typescript 属性不存在时编译类型脚本';t存在-使用点与使用方括号

Typescript 属性不存在时编译类型脚本';t存在-使用点与使用方括号,typescript,tsc,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. 使用点和方括号有什么区别。它基本上是一样的,不是吗?o.b被编译器理解为:“我想初始化类MyClass的这个属性(b)。这就是为什么会出现编译错

假设我有下面的类和代码-

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.

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

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


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

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


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

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

您可以通过在
tsconfig.json
文件中添加属性
noImplicitAny:true
告诉它给您警告。这将导致
o['b']
元素隐式提供一个“any”类型,因为类型“MyClass”没有索引签名。
错误。然后,为了避开它,你必须明确地声明,
o
将被视为一个any-like-so:
(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.

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

您可以通过在
tsconfig.json
文件中添加属性
noImplicitAny:true
告诉它给您警告。这将导致
o['b']
元素隐式提供一个“any”类型,因为类型“MyClass”没有索引签名。
错误。然后,为了避开它,你必须明确地声明,
o
将被视为一个any-like-so:
(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.

在Typescript中,当使用括号表示法(例如,
o['b']=5;
)时,类型检查被忽略。这就是我的问题——为什么。TypeScript的类型安全性在哪里消失了?这与类型安全无关:即使在c#这样的强静态类型语言中,
字典
也会编译,如果
字典
中没有给定的键,但在运行时会失败。在TS中,您可以选择在使用括号表示法(例如,
o['b']=5;
)时,在类型脚本中关闭此选项,类型检查被忽略。这就是我的问题-为什么。TypeScript的类型安全性在哪里消失了?这与类型安全无关:即使在c#这样的强静态类型语言中,
字典
也会编译,如果
字典
中没有给定的键,但在运行时会失败。您可以在TS中选择关闭此选项