【问题标题】:How to consume two typescript 0.9.5 interfaces that both describe a "get" function?如何使用两个都描述“get”函数的 typescript 0.9.5 接口?
【发布时间】:2014-01-07 05:56:05
【问题描述】:

我做了这个似乎是有效打字稿的例子(游乐场链接和内联): 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;
}

为什么需要这样做?

【问题讨论】:

    标签: dojo typescript


    【解决方案1】:

    关于属性需要相同的错误是一种常识——如果在第一个示例中未指定,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?
    

    I3 中显式声明get 的修复是正确的。如果它们适用于这种情况,您可以复制常量专用签名。

    【讨论】:

    • 谢谢。你的例子是一个很好的例子,我可以看到这种情况下的歧义,但在“get”的情况下,显然专门的“get”应该优先。但是没有优先级,因此 I1.get2 和 I2.get1 变得模棱两可?我没有完全看到编译器问题,但也许这就是您能够推理简单案例的意思。
    • 并不是说我的直觉有任何相关性,但为了回答你的问题,我假设 I3 会采用这种形式:{ get(name: "templatePath"): string;获取(名称:“baseClass”):字符串;获取(名称:字符串):任何;所以在你的例子中,我假设返回类型是一个数字(“y”比“x”): interface I3 { foo(a: string, b: "y"): number; foo(a: "x", b: string): boolean; foo(a:字符串,b:字符串):任何; }
    猜你喜欢
    • 2016-03-24
    • 2019-02-04
    • 2018-08-19
    • 1970-01-01
    • 2016-08-09
    • 2017-08-08
    • 2019-04-06
    • 2019-02-09
    • 2020-09-03
    相关资源
    最近更新 更多