interface I1 {
get(name: "templatePath"): string;
get(name: string): any;
}
interface I2 {
get(name: "baseClass"): string;
get(name: string): any;
}
interface I3 extends I1, I2 {
}
class C3 implements I3 {
get(name: string) {
return name;
}
}
我得到一个错误指示属性'get'的类型在这两个接口中不相同。 (1)我不明白这是多么重要;(2)我不知道如何解决这个问题。
具体来说,我的界面如下所示:
interface IGotoPane extends dijit._WidgetBase, dijit._TemplatedMixin, dijit._WidgetsInTemplateMixin {
inputCoordinates: dijit._Widget;
}
我发现我可以通过重新声明几种方法来消除编译器错误:
interface I3 extends I1, I2 {
get(name: string): any;
}
或者就我的具体问题而言,
interface IGotoPane extends dijit._WidgetBase, dijit._TemplatedMixin, dijit._WidgetsInTemplateMixin {
inputCoordinates: dijit._Widget;
get(name: string): any;
set(name: string, value: any, raiseChangeEvent?: boolean): void;
set(values: Dojo.PropertiesMap): void;
watch(prop: string, callback: Dojo.WatchCallback<any>): Dojo.WatchHandle;
}
为什么这有必要?
答案 0 :(得分:3)
关于需要相同的属性的错误是一种常识 - 如果在第一个示例中未指定,I3.get
的类型是什么?在TypeScript中没有任何“合并”函数类型的概念,因此不清楚这究竟是什么意思。
你可以推理一些简单的案例,但很快就会让人感到困惑,例如:
interface I1 {
foo(a: string, b: "y"): number;
foo(a: string, b: string): any;
}
interface I2 {
foo(a: "x", b: string): boolean;
foo(a: string, b: string): any;
}
interface I3 extends I1, I2 {
}
var x: I3;
var y = x.foo('x', 'y'); // y: number? boolean? any?
在get
中明确声明I3
的修正是正确的。如果适用于这种情况,您可以复制常量专用签名。