2016-10-05 18 views
3

を "拡張" 私はそうのように、活字体でextends制約を使用しています:活字体は、一般的な制約

class Animal {} 
class Lion extends Animal {} 
class Bear extends Animal { } 

class ZooKeeper<T extends Animal> { 
    constructor(p: T = new Animal()) { 

    } 
} 

new ZooKeeper(new Animal()); 

しかしp: T = new Animal()にエラーが含まれています:

Type 'Animal' is not assignable to type 'T'.

constructor Animal(): Animal

なぜ、と私は何をしますか、Animalサブタイプの代わりにAnimalを使用できるように、

Source

答えて

3

はTにあなたの動物をキャストし、それが動作します。

class ZooKeeper<T extends Animal> { 
    constructor(p: T = <T>new Animal()) { 

    } 
} 

(将来の読者のために)あなた自身のコメントによると、あなたも行うことができます。

class ZooKeeper<T extends Animal> { 
    constructor(p: T = new Animal() as T) { 

    } 
} 
1

あなたは私だけのために適切にコンパイルしているように見える、コンストラクタのパラメータ宣言から割り当てを残すことができます。パラメータを省略したままにしておくこともできます。

UPDATE:series0neのように指摘し、この解決策は1が提供されていないAnimalの既定のインスタンスを提供していません!

class ZooKeeper<T extends Animal> { 
    constructor(p?: T) { 
    } 
} 

var zk = new ZooKeeper<Lion>(new Lion()); 
var zk2 = new ZooKeeper(new Animal()); 
var zk3 = new ZooKeeper(); 

ZooKeeperクラスがタイプされ、あなたはTの子クラスの特定のプロパティにアクセスすることができます。

+0

これは問題を解決しません。放出されたJSを見ると、p:T = new Animal()が提供されていないデフォルトインスタンス(Animal)を出力します。あなたの実装はこれをしません! – series0ne

+0

私はJSの出力を見て、あなたが正しいですが、違いがあります。私はあなたの質問を完全には理解できませんでした、申し訳ありません。 – ther

+0

問題ありません。学習曲線のすべての部分、私の友人。私のコメントを反映するためにあなたの答えを更新する場合、私はdownvoteを削除します。 – series0ne

関連する問題