沒有錯誤下面編譯的打字稿要求論點打字稿是一個(子)的實例類定類的
abstract class Animal {
abstract talk() : string ;
}
class Chicken extends Animal {
talk() : string { return "cluck" ; }
}
class Duck extends Animal {
talk() : string { return "quack" ; }
}
function quack(d : Duck) {
console.log(d.talk()) ;
}
var a = new Chicken() ; // EDIT: `var a : Chicken = new Chicken()` gives the same result
quack(a) ;
我想什麼做的是改變定義Chicken
和Duck
或可能quack
的方式使得quack(a)
有編譯時錯誤。即Duck
類型的參數d
應該不能包含Chicken
s,也不能包含任何不是Duck
的直接或間接實例的其他對象。我知道我可以添加獨特的屬性到Chicken
和Duck
來區分它們。例如。
class Duck extends Animal {
onlyInDuck : string ;
talk() : string { return "quack" ; }
}
class Chicken extends Animal {
onlyInChicken : string ;
talk() : string { return "cluck" ; }
}
但是,這似乎是一個粗糙的黑客。
是否有一種優雅的方式來要求函數參數是參數類型的(子)類的實例?
雞可能像鴨子一樣走路,但他們不會像鴨子一樣說話。 –
試試這個:var a:Chicken = new Chicken();這將迫使'a'是雞的類型。 – Delta
@Delta將'a'的類型聲明爲'Chicken'並沒有什麼區別。 –