2014-01-06 26 views
1

我做了什麼,似乎是有效的打字稿(遊樂場鏈接和嵌入以及)這個例子: 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如何使用兩個描述「get」函數的打字稿0.9.5接口?

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

我得到一個錯誤指示類型的財產「得到」不是這兩個接口相同。 (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; 
} 

爲什麼這是必要的?

回答

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? 

I3明確聲明get解決方法是正確的。如果適用於這種情況,您可以複製常量專用簽名。

+0

謝謝。你的例子是一個很好的例子,我可以看到在這種情況下的含糊不清,但在「獲得」的情況下,似乎顯然應該優先考慮專門的「get」。但是沒有優先權,因此I1.get2和I2.get1會變得模糊不清?我沒有完全看到編譯器問題,但也許這就是你能夠推斷簡單情況的意思。 –

+0

不是說我的直覺與你的問題有任何關係,而是我認爲I3會採用這種形式:get(name:「templatePath」):string; get(name:「baseClass」):string; get(name:string):any;所以在你的例子中,我會假設返回類型是一個數字(「y」beats「x」): 接口I3 foo(a:string,b:「y」):number; (a:「x」,b:string):boolean; foo(a:string,b:string):any; } –