2016-08-06 20 views
0

Ich versuche eine DefinitelyTyped TS-Definitionsdatei für eine JS-Klasse zu implementieren, die je nach ihrer Instanziierung unterschiedliche Definitionen hat. Die Definitionen sind gut definiert und ändern sich nach der Instanziierung nicht.
Beispiel:Wie erstelle ich eine TypeScript-Definitionsdatei für eine Klasse, deren Eigenschaften sich je nach Instanziierung ändern

var a = new MyClass("foo"); 
console.log(a.a);//"a" 
console.log(a.b);//"b" 
console.log(a.c);//"c" 
console.log(a.d);//"undefined" 
console.log(a.e);//"undefined" 
console.log(a.f);//"undefined" 

var b = new MyClass("bar"); 
console.log(b.a);//"undefined" 
console.log(b.b);//"undefined" 
console.log(b.c);//"c" 
console.log(b.d);//"d" 
console.log(b.e);//"e" 
console.log(b.f);//"f" 

ich wie ein TS-Definition etwas möchten:

interface myInterface{ 
    c:string; 
} 
class MyClass("foo") implements myInterface{ 
    a:string; 
    b:string; 
    c:string; 
} 
class MyClass("bar") implements myInterface{ 
    c:string; 
    d:string; 
    e:string; 
    f:string; 
} 

Alle Zeiger sehr geschätzt
EDIT wäre: Klarstellung: Ich nicht MyClass
auch ändern kann, gibt es eine Vielzahl von verschiedenen Möglichkeiten der Instanziierung MyClass, aber sie sind alle gut bekannt und definiert im Voraus der Zeit. Wir können auch annehmen, dass wir uns nicht um den Fall einer nicht existierenden Variante von MyClass kümmern müssen.
Darüber hinaus ist MyClass am besten als eine Fabrik beschrieben, die den Zugriff auf eine Datenbank ermöglicht; so würde new MyClass("foo") ein Objekt erstellen, die den Zugriff auf die foo Tabelle in der Datenbank ermöglicht, wo die Feldnamen sind nun Eigenschaften des erzeugten MyClass Objekt

+2

Wenn sie anders sind, warum ist es die gleiche Klasse? Warum nicht zwei verschiedene Klassen machen? – Alex

+0

Die Syntax 'Klasse MyClass (" foo ") implementiert myInterface {' ist falsch. –

+0

Sie suchen nach dem Fragezeichen ('?'), Wie in 'd ?: string;'. –

Antwort

-1

Wenn Sie die Kontrolle über den Code haben ...

Sie sollten darüber nachdenken, es zu beheben. Was Sie beschreiben, sind zwei verschiedene Typen. Es macht wenig Sinn, wenn eine Klasse ihren Typ abhängig von den Eingabeparametern ändert. Die MyClass in Ihrem Beispiel sieht aus wie eine ungerade Fabrik, die den Konstruktor anstelle einer Methode verwendet, um Objekte zu erstellen.

so etwas wie dies mit Union-Typen und Typ Wachen Eine Lösung in Code aussehen könnte:

class Foo { 
    public FooMember: string = "I'm foo"; 
} 

class Bar { 
    public BarMember:string = "I'm bar"; 
} 

let myObj: Foo | Bar; 

myObj = new Foo(); // or FooBarFactory.GetInstance("Foo") or whatever 

if(myObj instanceof Foo){ 
    console.log(myObj.FooMember); 
} else { 
    console.log(myObj.BarMember); 
} 

Wenn Sie die Kontrolle nicht über den Code ... haben Sie

... sind im Grunde genommen Pech, da sie je nach Eingabe des Konstruktors anders getippt werden. Sie können den Konstruktor einer Klasse nicht eingeben, um etwas anderes als den Typ der Klasse zurückzugeben.