在声明后向内联对象添加新成员时,TypeScript编译器会产生烦恼

时间:2013-10-17 23:04:55

标签: typescript

我有一个大型的(2000行)javascript文件,我正在通过转换为打字稿来解决问题,在我目前遇到的烦恼中,我看到这样的模式:

var data = { some_property: some_value, another_property: some_other_value };

然后是:

$.ajax({

...

complete: function(cfg) {
    var result = JSON.parse(cfg.responseText);
    data.some_property = result.some_property; // This is fine.
    data.some_different_property = result.some_different_property; // error
});

我得到一个错误:属性'some_different_property'在类型'{some_property:...,another_property:...}'的值上不存在。

虽然这很酷,它从var data = {...}的行中的值推断出类型,但是将所有潜在的属性手动写入数据是相当痛苦的。使用了模式,这是一个编译错误。

是否有一些编译器标志/方式让编译器推断出这里的数据也有some_different_property?:(从使用中推断出来的类型)而不是堵塞我的错误列表?

2 个答案:

答案 0 :(得分:1)

没有任何编译器标志。但是,您始终可以手动将其键入:

var data:any = { some_property: some_value, another_property: some_other_value };

在这里,您告诉编译器忽略我为此变量分配的内容,可能还有其他属性(甚至可能称为some_propertIE,即一旦允许,编译器无法为您检查任何拼写错误)。

或者,您可以将声明/分配拆分为单独的行。在这种情况下,默认情况下,类型被推断为any。但是,将此设置为默认模式可能会导致有效的无类型代码。

var data; // compiler infers it to by any 
data = { some_property: some_value, another_property: some_other_value }; // and you can assign anything

答案 1 :(得分:1)

您可以使用可选参数定义接口,然后指定您的变量与该接口匹配:

interface my_interface {
  some_property;    // type defaults to 'any'
  another_property: string;
  some_different_property?: number;
}
var data: my_interface = { some_property: 10, another_property: '' };
data.some_different_property = 99;

如果不重复使用此接口,您也可以内联执行此操作:

var data2: { prop1; prop2; prop3? } = { prop1: 1, prop2: 2 };
data2.prop3 = "three";