2015-11-05 71 views
3

在下面的示例(Typescript,1.7+)中,我需要更改哪些內容以允許B.callback擁有與A.callback不同的簽名?改變Typescript中子類的方法簽名?

class A { 
    callback(result: number) { 
    } 
} 


class B extends A { 
    callback(result: number, option: number) { 
    } 
} 

目前這給test.ts(7,7): error TS2415: Class 'B' incorrectly extends base class 'A'.

在現實世界中我的例子是比較複雜的,但我可以動態地(或多或少)保證(基於某些配置)所請求的參數將在那裏。

回答

3

根據不同的情況,提出如下解決方案可滿足太:

class A { 
    callback(result: number) { 
    } 
} 


class B extends A { 
    callback(result: number, option?: number) { // make 'option' optional 
    } 
} 
0

我懷疑這是不可能在TypeScript 1.6和即將到來的1.7。請給B.callback()一個新名稱,或者在A.callback()中添加該參數作爲可選參數。

從傳統的OOP角度來看,它感覺有些錯誤,即C#,Java。人們不應該能夠在重寫的方法中更改參數的數量。對類A的引用是能夠保存類B對象。如果B向方法添加了非可選參數,則通過A引用對方法的調用將失敗。這將作爲編譯器的錯誤引發。

+0

從傳統的角度來看,我和你在一起。在我的例子中,儘管'callback'被傳入Angular(作爲一個控制器),並且動態地接收了一些基於它的配置的參數(這是在B的'constructor()'中設置的)。 – left4bread

0

經過一番來回我認爲最好的辦法是目前:

class A { 
    callback(result: number, ...rest: any[]) { 
    } 
} 


class B extends A { 
    callback(result: number, option: number) { 
    } 
} 
2

這將永遠不會被允許。您需要符合基類的函數簽名,因爲它的多態性101

class A { 
    callback(result: number) { 
    } 
} 


class B extends A { 
    callback(result: number, option?: number) { 
    } 
} 

// Reason 
var b = new B(); 
var a:A = b; // okay as its a subclass 
a.callback(123); // If b didn't have that optional B.callback can blow up 
+0

嗯,是的,但有人可能會說任何參數在任何時候都可能是未定義的,所以'a.callback(123)'仍然是對'b'的有效方法調用。 – left4bread

+0

'仍然是一個有效的方法調用b'顯式傳遞'undefined'與隱含的undefined不同。如果你發現自己傳遞了一個未定義的...請考慮將它作爲一個可選參數 – basarat