2016-05-14 5 views
0

Ich bin neu in Typoskript und dies ist die Funktion, die ich geschrieben habe:(TypeScript) Wie erfasst man den vom Benutzer in der generischen Funktion bereitgestellten Typ?

/** 
    * @function getComponent() 
    * @description finds and returns the requested type of component, null if not found 
    * @return {any} component 
    */ 
    public getComponent<T extends Component>(): T{ 
     for(let i = 0; i < this.componentList.length; i++){ 
      if(<T>this.componentList[i] instanceof Component){ 
       return this.componentList[i] as T; 
      } 
     } 

     return null; 
    } 

Diese Funktion ist in der Gameobject-Klasse, die eine Liste der Komponenten enthält

Component-Objekte ist eine abstrakte Funktion, die sein kann, erweitert durch andere Klassen. Ich möchte, dass diese Funktion den vom Benutzer angeforderten Komponententyp zurückgibt. Zum Beispiel so etwas:

Ich glaube, ich mache etwas falsch, irgendeine Hilfe?

Antwort

1

Sie kennen den generischen Typ zur Laufzeit nicht, alle Typen werden vom Compiler entfernt, weil er in Javascript nicht unterstützt wird.

Wenn ich Sie verstehen, dann vielleicht kann dies den Trick für Sie tun:

abstract class Component {} 

class Component1 extends Component {} 
class Component2 extends Component {} 
class Component3 extends Component {} 

class ComponentsArray extends Array<Component> { 
    public getInstanceFor<T extends Component>(componentClass: { new(): T }) { 
     for (var i = 0; i < this.length; i++) { 
      if ((<any> this[i].constructor).name === (<any> componentClass).name) { 
       return this[i]; 
      } 
     } 

     return null; 
    } 
} 

let array = new ComponentsArray(); 
array.push(new Component1()); 
array.push(new Component2()); 
array.push(new Component3()); 

let component2: Component2 = array.getInstanceFor(Component2); 
console.log(component2); // Component2 {} 

Wenn Sie das componentList Mitglied ersetzen werden Sie in Ihrem GameObject Klasse aus (was ich nehme an ist) eine regelmäßige Array zu ComponentsArray dann getComponent Funktion ist einfach:

public getComponent<T extends Component>(componentClass: { new(): T }): T { 
    return this.componentList.getInstanceFor(componentClass); 
} 

Und dann:

let gameObject = new GameObject(); 
let audioComponent = gameObject.getComponent(AudioComponent);