2016-07-13 4 views
0

Ich arbeite an einer Funktion, die einen Parameter nehmen und zurückgeben, der Parameter ist eine Objektkarte, das Problem ist, wie die Intelligenz mit Param arbeiten und Wert zurückgegeben, hier habe ein Bild Preview Gif Image erklären, was ich will.Wie TypeStics Generics Type Intelligence funktioniert wie erwartet

Danke.

// object 
 
interface P { 
 
    id?: number; 
 
    name?: string; 
 
    desc?: string; 
 
} 
 

 

 
// params 
 
interface Params<T> { 
 
    [key: string]: P 
 
} 
 

 

 
// function 
 
function create<T>(params: T): T{ 
 
    return params 
 
} 
 

 

 

 
var s = create({ 
 
    item: { 
 
     id: 1, 
 
     name:'name',   
 
    } 
 
}) 
 

 

 

+0

Ich bin mir nicht sicher über Ihr Problem, aber vielleicht sollten Sie die Dokumentation über [Typ Wachen] (https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-guards-and- differenzierende Typen). – Paleo

+0

Erhalten Sie keine nützlichen Informationen zu diesem Problem. – bang

Antwort

0

Alles scheint in Ihrem animierten GIF völlig in Ordnung. Wenn ohne explizite Eingabe verwendet, die erstellen Funktion was auch immer Sie Zeug in es, solange es mit seiner Funktion Signatur entspricht.

function create<T>(params: T): T; 

Hier T ist beliebig und die implizite Typsystem entspricht s auf die Struktur des Objektliteral Sie in erstellen setzen. Deshalb können Sie auf .item auf s zugreifen, aber wenn Sie versuchen, s ["foo"]. Id wird es nicht funktionieren.

function create<T>(params: Params<T>): Params<T>; 

Dies funktioniert immer noch wie erwartet. Argument Parameter ist jetzt von einer Index-Signatur, sowie der Rückgabetyp. Die Art, wie Sie create aufrufen, das äußere Objektliteral genügt der Indexsignatur und die enthaltene Struktur entspricht P. Jetzt, wenn Sie versuchen s.item wird es nicht funktionieren, weil es keine explizit angegebene Eigenschaft Element in Ihrer Schnittstelle Params. Aber wenn Sie versuchen s ["foo"]. Id Sie werden sehen, es funktioniert.

Bitte beachten Sie, dass es sich hierbei nur um Typensicherheit handelt, was bedeutet: Auch wenn der Compiler sagt, dass es in Ordnung ist, können Sie nicht auf s ["foo"] .id zur Laufzeit zugreifen, wenn dort kein "foo" ist.

Es ist wichtig, den Unterschied von variable.some und Variable [ "some"] in Typoskript zu verstehen. Die erste erfordert Variable 's Typ zu einige. Letzteres erfordert entweder einige oder eine Index Signatur zu sein.

Ihr Beispiel ist zwar seltsam, da Ihre Schnittstelle Params generischer Typ ist, aber der allgemeine T ist nicht beteiligt. Für den Fall, dass Sie die zweite der oben genannten Signaturen verwenden, ist Create selbst nicht generisch, sondern streng typisiert gegen Params und daher P.

+0

Vielen Dank für Ihre Antwort, vielleicht sollte ich einen anderen Weg wählen, um mein Problem zu lösen, ich möchte nur die automatische Vervollständigung kann wie erwartet funktionieren.aber haben keine Lösung im Moment. – bang

+0

Aber das ist mein Punkt. Es funktioniert wie erwartet. An welchem ​​Punkt ist es nicht? – sgrtho

+0

Wenn ein Ding nur eine Index-Signatur hat, wie Ihre 'Params', hat der Compiler (und Intellisense) keine Möglichkeit, seine Eigenschaftsnamen zu kennen. Mit einer Index-Signatur 'let p: Params = {}; p ["+ Math.random()] = foo;' ist vollständig gültig. Die Eigenschaftennamen von 'p' sind jedoch erst zur Laufzeit bekannt, und TypeScript führt ** Ihren Code ** nicht tatsächlich aus. – sgrtho

Verwandte Themen