2017-06-19 8 views
0

Ich habe Funktion, die Instanzen der gegebenen Klasse schafft und ich weiß nicht, wie Typoskript zu sagen, dass:
Function Builder gibt Instanzen der Klasse in der ersten Argument übergebenTyposkript: convert typeof zurück zum Beispiel

class A extends HTMLElement { 
    color: 'white' 
} 

function builder<T extends typeof HTMLElement>(classParam: T) { 
    let instance = new classParam() 
    return instance 
} 

let instance = builder(A) 
instance.color = 'black' 
// Property 'color' does not exist on type 'HTMLElement' 

Ist ist es möglich, ohne Typzusicherung?

+0

verändert die Unterschrift des Builder "erlaubt"? – Julian

+0

Ja, Sie können es ändern – pravdomil

+0

Sie können nicht ein neues HTMLElement, aber ich verstehe nicht, was Sie versuchen, zu tun. Suchen Sie zufällig nach 'document.createElement()'? –

Antwort

1

Ich habe festgelegt und erklärt die Probleme:

class A extends HTMLElement { 
    color: string = 'white' // you gave it the type "white", 
          // but I assume you need the value "white" (and type `string`) 
} 


function builder<T extends HTMLElement>(classParam: { new(): T }) : T { 
    // previous line: 
    // - `typeof` in the generic constraint is not valid 
    // - the parameter could not be of type `T`, because you would not be 
    // able to use `new`. It's now a parameter which has a constructor 
    // which creates a `T` 
    // - we are now returning `T`, instead of (implicit) `any` 
    let instance = new classParam() 
    return instance 
} 

let instance = builder(A) 
instance.color = 'black' 

Link zu playground

+0

vereinfacht Ich habe Typ 'HTMLElement' ist nicht zu Typ 'T' zuweisbar, versuchen Sie es in TypeScript Spielplatz – pravdomil

+0

Ich nahm an, dass Ihr Code gültig war, aber dort wo einige Fehler. Es wurde behoben und auf dem Spielplatz getestet – Julian