使用VS2013 Update 2 CTP的Typescript 1.0:我们的代码中有许多重大变化

时间:2014-03-19 16:31:40

标签: javascript typescript

今天尝试将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版本的影响,这是一个灾难性的。

1 个答案:

答案 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'也可以编译。