2016-10-05 5 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

Cast ваше животное 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 отметил, это решение не обеспечивает экземпляр по умолчанию 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

 Смежные вопросы

  • Нет связанных вопросов^_^