我觉得有点烦人的是,一些普通的javascript功能在typescript中语法上并不正确。
特别是在空对象中添加属性(如本例所示)是不可能的,因为Typescript假定空对象为Type {{}'而没有任何属性。
var a = {};
a.property = 1; // Error
要解决这个问题,我必须将空对象定义为可索引类型。
var b: { [x:string] : any} = {};
b.property = 1;
有解决方法吗?
答案 0 :(得分:3)
语法上代码是正确的,从语义上讲它是不正确的。即使出现此错误,您仍然可以发出Javascript,默认情况下,如果您只有语义错误(不匹配的类型,额外的属性等),那么Typescript将会这样做
Typescript检查您是否与分配给对象的类型一致,并且类型是在第一次分配时确定的。
你可以做几件事之一,你已经发现的一件事,这允许你在对象上设置任何属性:
var b: { [x:string] : any} = {};
如果属性集已知,您可以显式声明属于对象的属性:
var b: { property?: string } = {};
或者,如果您根本不想打扰类型,可以使用any
:
var b: any = {};
当你放弃所有类型检查时,不推荐最后一个。第二个是最好的,您将所有属性限制为正确的类型,并确保不会向对象添加任何额外的属性。如果在运行时不知道对象的属性,那么第一个是好的。
如果多次重复使用相同类型,则可以使用界面:
interface TypeOfB { property?: string }
var b: TypeOfB = {}
答案 1 :(得分:0)
您可以使用
var a = {};
a["property"] = 1;
这样对TS和JS来说都是正确的