如何使用两个描述“get”函数的typescript 0.9.5接口?

时间:2014-01-06 21:01:12

标签: dojo typescript

我做了一个似乎有效的打字稿(游乐场链接和内联)的例子: http://www.typescriptlang.org/Playground/#src=interface%20I1%20%7B%0A%09%09get(name%3A%20%22templatePath%22)%3A%20string%3B%0A%09%09get(name%3A%20string)%3A%20any%3B%09%0A%7D%0A%0Ainterface%20I2%20%7B%0A%09%09get(name%3A%20%22baseClass%22)%3A%20string%3B%0A%09%09get(name%3A%20string)%3A%20any%3B%0A%7D%0A%0Ainterface%20I3%20extends%20I1%2C%20I2%20%7B%0A%09%0A%7D%0A%0Aclass%20C3%20implements%20I3%20%7B%0A%09%09get(name%3A%20string)%20%7B%0A%09%09%09return%20name%3B%0A%09%09%7D%09%0A%7D

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;
}

为什么这有必要?

1 个答案:

答案 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的修正是正确的。如果适用于这种情况,您可以复制常量专用签名。