我有一个大型的(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?:(从使用中推断出来的类型)而不是堵塞我的错误列表?
答案 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";