2016-09-21 20 views
15

class türünü nasıl bildirebilirim, böylece nesnenin genel bir sınıf kurucusudur? Aşağıdaki örnekte Sınıfta yapıcı türü var mı?

, bunu Penguin veya Lion olabilir ya o yüzden AnimalClass için vermesi gereken tip bilmek istiyorum:

Tabii
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 tip çalışmaz ve it would zaten çok genel olmak.

cevap

22
typescript interfaces reference den

Çözüm:

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); 

Yani önceki örnekte haline gelir: Sadece bu çözüm benim için işe yaramadı ve kullanmak isterseniz çalışmaz eklemek istedim

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

Sıfır olmayan sayıda argüman alan bir kurucu. Bu örneğin neden işe yaradığını anlayabilmem için sonsuza kadar sürdü ama benim kodum yoktu. Arama yaptıktan sonra bulduğum şey, AnimalClass: typeof Animal' kullanmaktı. Bu, belirli bir sınıfın alt sınıflarını dinamik olarak yüklemek için çalışacaktır. – pixelpax

+0

@pixelpax Sıfır olmayan bir argüman yapıcıyı şu şekilde tanımlayabilirsiniz: "new (... args: any []): Animal" – Sammi

+0

@Sammi, Teşekkürler, çözümünüz anlamlıdır. Benim için, "Hayvanın herhangi bir alt sınıfının türü" anlamına gelmek için "Hayvan" türünü kullanmak gerçekten iyi çalıştı ve kodda açıklayıcı görünüyor. – pixelpax

İlgili konular