我在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
}
}
答案 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;
}
}
}