2017-08-07 1 views
1

Ich vereinfache die Frage hier.Dynamische Schnittstellen mit Generika

interface Identity{ 
    name: string; 
} 

Eine weitere generische Schnittstelle

interface State<T extends Identity>{ 
    [T.name] : StateContainer<T> 
} 

Aber das wird nicht funktionieren, da es

Wenn ich es es innen, indem sie versuchen, zu erzeugen, nicht gefunden T Fehler

gibt eine Funktion

function generate(c : Identity){ 
    interface State<T>{ 
     [c.name]: StateContainer<T> 
    } 
} 

Es sagt

Eineine berechneten Eigenschaftsnamen in einer Schnittstelle direkt an Einbau-Symbol beziehen.

Meine gewünschte Ausgabe soll dynamische Schnittstelle solcher haben. State<Tenant> sich verhalten soll

interface State{ 
    'tenant': .... 
} 
+0

Was Sie versuchen zu erreichen? Ich bin irgendwie auf einer Typoskript-Seite hier, weil ich Ihren Code auch nicht verstehe. – smnbbrv

+0

Ich versuche tatsächlich, generischen Code zu generalisieren, ich aktualisierte meine erwartete Ausgabe – Skeptor

+0

Was ist die Verbindung zwischen 'Mieter' Typ und' 'Mieter'' Schnur? Woher soll letzterer geholt werden? – zerkms

Antwort

1

Sie mapped types verwenden können:

type State<T extends Identity> = { 
    [P in keyof T] : StateContainer<T> 
} 
+0

Es gibt einen Fehler: 'Ein berechneter Eigenschaftsname muss sein vom Typ 'string', 'number', 'symbol' oder 'any'. Kann den Namen "keyof" nicht finden. Haben Sie es versucht und für Sie gearbeitet? – Skeptor

+0

Hier ist ein [Beispiel] (http://www.typescriptlang.org/play/#src=interface%20Identity%7B%0D%0A%20%20%20%20name%3A%20string%3B%0D%0A% 7D% 0D% 0A% 0D% 0Ainterface% 20StateContainer% 3CT% 3E% 7B% 0D% 0A% 20% 20% 20% 20State% 3A% 20Objekt% 3B% 0D% 0A% 7D% 0D% 0A% 0D% 0Ainterface% 20Tenant% 20Extenden% 20Identity% 20% 7B% 0D% 0A% 20% 20% 20% 20%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 20% 3D% 20% 7B% 0D% 0A% 20% 20% 20% 20% 5BP% 20in% 20Schlüssel% 20T% 5D% 20% 3A% 20StateContainer% 3CT% 3E% 0D% 0A% 7D% 0D% 0A% 0D% 0Adeclare% 20let% 20x% 3A% 20State% 3CTenant% 3E% 3B% 0D% 0Ax.sometenantprop) – Saravana

+0

Aber nach dem aktualisierten Beispiel sieht es so aus, als ob Sie den Eigenschaftsnamen aus dem Laufzeitwert für 'Identity.name' wollen. Ich glaube nicht, dass das funktionieren wird, da Interfaces nur zur Kompilierzeit verfügbar sind. – Saravana