如何为相同的命名方法创建Typescript Type Definition

时间:2016-07-23 00:31:54

标签: typescript kendo-ui

我在Typescript

中有以下定义
**sample.d.ts**

declare namespace Sample {

    class Widget {
        name(): string;  // gets the name
        name(name: string): void;    // sets the name
    } 
}

当我创建以下派生类型时,我没有收到任何警告:

export class BarWidget extends Sample.Widget {

    public name(): string {
        return '';
    }
}

但是,当我创建以下类型时,我收到一个Typescript错误:

export class FooWidget extends Sample.Widget {

    public name(name: string): void {

    }
}

错误消息是:

  

类'FooWidget'错误地扩展了基类'Widget'。种类   财产'名称'是无可比拟的。输入'(name:string)=>无效'是   不能分配给'{():string; (name:string):void;}'

更新

这个问题涉及对诸如kendo.ui之类的图书馆的支持:

https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/kendo-ui/kendo-ui.d.ts#L3373

在该代码文件中,需要使用以下语法设置和获取DropDownList的value属性:

let foo = dd.value();
dd.value('new value');

我的最终解决方案是将kendo.ui.d.ts中的定义更改为:

declare namespace Sample {
    class Widget {
        name(name?: string):string
    } 
}

1 个答案:

答案 0 :(得分:2)

TypeScript不能像其他类型语言(例如Java)那样进行所有相同的重载。请参阅this question

为了超载这个,你必须使用TypeScript的奇怪的多功能定义,这个定义在我链接的问题中有更详细的描述。

declare namespace Sample {

    class Widget {
        name():string;
        name(name:string):void;
    }

}

export class BarWidget extends Sample.Widget {

    private _name:string;

    name():string;
    name(name:string):void;
    name(name?:string):string {
        if(name) {
            this._name = name;
        } else {
            return undefined;
        }
    }

}