2016-12-17 3 views
1

Ich habe die folgenden interface.Verschiedene Typen für Typescript Index Signatur

interface IDetails { 
    name: string; 
    age: number; 
} 

interface IConfig { 
    appName: string; 
    userDetails: IDetails; 
    [key: string]: string | IDetails 
} 

const details: IConfig = { 
    appName: 'test', 
    userDetails: { 
    name: 'xyz', 
    age: 67, 
    }, 
} 

const t: string = 'userDetails' 
const name: string = details[t].name 
//        ^^^^ 
// throws the following error 
// 
// Property 'name' does not exist on type 'string | IDetails'. 
// Property 'name' does not exist on type 'string'. 

Wenn ich versuche, der Schlüsselsignatur mehrere Typen/Schnittstellen zuzuordnen, erhalte ich diesen Fehler. Ich weiß, dass ich [key: string]: any verwenden kann. Aber ich möchte es nicht verallgemeinern. Gibt es einen möglichen Weg, dies zum Funktionieren zu bringen?

Link to TypeScript Playground

+0

Können Sie gieße eine IDetails: '( Details [t]). name' –

+0

Danke für den Tipp. Warum 'string | IDetails funktioniert nicht? –

+0

Warum haben Sie '[key: string]: string | IDetails? ohne es würde das, was du versuchst, einfach funktionieren. Erwarten Sie mehr Eigenschaften? –

Antwort

4

Wenn Sie die Eigenschaften von details dynamisch zuzugreifen gehen, dann besser nutzen type guards:

function isDetails(obj: string | IDetails): obj is IDetails { 
    return Object.keys(obj).length === 2 && typeof obj["name"] === "string" && typeof obj["age"] === "number"; 
} 

Dann können Sie tun:

if (isDetails(details[t])) { 
    // details[t].name should be fine with the compiler 
} 
Verwandte Themen