2016-09-21 5 views
15

Как я могу объявить тип class, так что я гарантирую, что объект является конструктором общего класса?Тип конструктора классов в машинописном тексте?

В следующем примере, я хочу знать, какой тип я должен дать AnimalClass так, чтобы он мог быть либо Penguin или Lion:

class Animal { 
    constructor() { 
     console.log("Animal"); 
    } 
} 

class Penguin extends Animal { 
    constructor() { 
     super(); 
     console.log("Penguin"); 
    } 
} 

class Lion extends Animal { 
    constructor() { 
     super(); 
     console.log("Lion"); 
    } 
} 

class Zoo { 
    AnimalClass: class // AnimalClass could be 'Lion' or 'Penguin' 

    constructor(AnimalClass: class) { 
     this.AnimalClass = AnimalClass 
     let Hector = new AnimalClass(); 
    } 
} 

Конечно, class тип не работает, и это было бы все равно.

ответ

22

Решение от typescript interfaces reference:

interface ClockConstructor { 
    new (hour: number, minute: number): ClockInterface; 
} 
interface ClockInterface { 
    tick(); 
} 

function createClock(ctor: ClockConstructor, hour: number, minute: number): ClockInterface { 
    return new ctor(hour, minute); 
} 

class DigitalClock implements ClockInterface { 
    constructor(h: number, m: number) { } 
    tick() { 
     console.log("beep beep"); 
    } 
} 
class AnalogClock implements ClockInterface { 
    constructor(h: number, m: number) { } 
    tick() { 
     console.log("tick tock"); 
    } 
} 

let digital = createClock(DigitalClock, 12, 17); 
let analog = createClock(AnalogClock, 7, 32); 

Так предыдущий пример становится:

interface AnimalConstructor { 
    new(): Animal; 
} 

class Animal { 
    constructor() { 
     console.log("Animal"); 
    } 
} 

class Penguin extends Animal { 
    constructor() { 
     super(); 
     console.log("Penguin"); 
    } 
} 

class Lion extends Animal { 
    constructor() { 
     super(); 
     console.log("Lion"); 
    } 
} 

class Zoo { 
    AnimalClass: AnimalConstructor // AnimalClass can be 'Lion' or 'Penguin' 

    constructor(AnimalClass: AnimalConstructor) { 
     this.AnimalClass = AnimalClass 
     let Hector = new AnimalClass(); 
    } 
} 
+0

Я просто хотел бы добавить, что это решение не работает для меня, и не будет работать, если вы хотите использовать конструктор, который принимает ненулевое число аргументов. Взял меня навсегда, чтобы понять, почему этот пример работает, но мой код этого не сделал. То, что я нашел после нескольких часов поиска, было использовать «AnimalClass: typeof Animal». Это будет работать для динамической загрузки подклассов данного класса. – pixelpax

+0

@pixelpax Вы можете определить конструктор ненулевых аргументов следующим образом: 'new (... args: any []): Animal' – Sammi

+0

@Sammi, Спасибо, ваше решение имеет смысл. Для меня использование 'typeof Animal' для обозначения« типа любого подкласса Animal »работало очень хорошо и выглядит описательно в коде. – pixelpax

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