今天尝试将VS2013更新到Update 2 CTP版本。一切正常,但TypeScript编译器对我们的代码变得过于严格。使用0.9.1.1版本编写的所有代码在更新后都会被破坏。
我们有例如扩展Kendo DataSource的代码。在DataSource中,存在一个'transport'属性,它具有'parameterMap'属性,该属性接受如下定义的函数:
interface DataSourceTransport {
parameterMap?(data: DataSourceTransportParameterMapData, type: string): any;
}
interface DataSourceTransportParameterMapData {
aggregate?: DataSourceParameterMapDataAggregate[];
group?: DataSourceParameterMapDataGroup[];
filter?: DataSourceParameterMapDataFilter;
models?: Model[];
page?: number;
pageSize?: number;
skip?: number;
sort?: DataSourceParameterMapDataSort[];
take?: number;
}
如您所见,parameterMap参数接受一个接受'DataSourceTransportParameterMapData'的函数。
现在在我们的代码中,我们使用一些额外的属性来扩展这个参数:
parameterMap: function (data: any, operation: string) {
if (operation === "create") {
data.TypeName = 'ActiviteitEntity';
}
if (operation === "update" || operation === 'destroy') {
data.Xml = contractors.htmlEncode(data.Xml);
} }
这个构造被0.9.1.1编译器排除在外,但1.0编译器告诉我'DataSourceTransportParameterMapData'上没有'TypeName'和'Xml'属性是正确的。但我们将'data'参数定义为'any'类型。
因此,尽管我们将其定义为“any”,但编译器仍然拒绝添加新属性(b.t.w.在JavaScript中可以正常工作)。
这只是我现在遇到的问题之一,但还有很多我尚未开始分析的问题。
我暂时卸载了Update 2 CTP,但是有一段时间必须切换到TypeScript 1.0。正如我现在估计的那样,没有一段代码不受1.0版本的影响,这是一个灾难性的。
答案 0 :(得分:0)
我可以打赌以下代码没有给你任何错误:
function parameterMap(data: any, operation: string) {
if (operation === "create") {
data.TypeName = 'ActiviteitEntity';
}
if (operation === "update" || operation === 'destroy') {
data.Xml = contractors.htmlEncode(data.Xml);
}
}
但如果您尝试这样做, 会出现错误(示例' a'):
var data:DataSourceTransportParameterMapData;
parameterMap(data,'create');
console.log(data.TypeName); // Error TypeName does not exist on DataSourceTransportParameterMapData
仅仅因为您将变量传递给函数(接受any
)并不会更改变量的外部类型。
要告诉打字稿有关您可以随时执行的类型的扩展程序:
interface DataSourceTransportParameterMapData {
TypeName?: string;
}
由于接口是开放式的(多个定义被合并),这将导致像样本' a'也可以编译。