2016-07-08 13 views
12

ho un oggetto in cui tutte le chiavi sono stringhe, alcuni dei valori sono stringhe e il resto sono oggetti in questa forma:interfaccia tipografico per gli oggetti con alcuni noti e alcuni nomi di proprietà sconosciuti

var object = { 
    "fixedKey1": "something1", 
    "fixedKey2": "something2", 
    "unknownKey1": { 'param1': [1,2,3], 'param2': "some2", 'param3': 'some3'}, 
    "unknownKey2": { 'param1': [1,2,3], 'param2': "some2", 'param3': 'some3'}, 
    "unknownKey3": { 'param1': [1,2,3], 'param2': "some2", 'param3': 'some3'}, 
    ... 
    ... 
}; 

In questo oggetto fixedKey1 e fixedKey2 sono le chiavi conosciute che saranno presenti in quell'oggetto. unknownKey - la coppia di valori può variare da 1-n.

ho cercato di definire l'interfaccia dell'oggetto come:

interface IfcObject { 
    [keys: string]: { 
     param1: number[]; 
     param2: string; 
     param3: string; 
    } 
} 

Ma questo getta il seguente errore:

Variable of type number is not assignable of type object

Che ho scoperto che non è in grado di assegnare questa interfaccia per " fixedKey - value "pair.

Quindi, come posso eseguire il controllo di tipo di questo tipo di variabili?

risposta

8

Non è esattamente quello che vuoi, ma è possibile utilizzare un union type:

interface IfcObject { 
    [key: string]: string | { 
     param1: number[]; 
     param2: string; 
     param3: string; 
    } 
} 
1

Come @Paleo spiegato è possibile utilizzare la proprietà sindacato per definire un'interfaccia per l'oggetto corrispondente.

Direi che dovresti definire un'interfaccia per i valori degli oggetti e quindi dovresti definire il tuo oggetto originale.

campione interfaccia può essere

export interface IfcObjectValues { 
    param1: number[]; 
    param2: string; 
    param3: string;   
} 

export interface IfcMainObject { 
[key : string]: string | IfcObjectValues; 
} 
3

La risposta corretta a questa domanda è:

export interface IfcObjectValues { 
    param1: number[]; 
    param2: string; 
    param3: string;   
} 

interface MyInterface { 
    fixedKey1: string, 
    fixedKey2: number, 
    [x: string]: IfcObjectValues, 
} 

Il codice in azione, see here.

+0

Sì, sarà più preciso, ma scrivendo ancora il tipo ** qualsiasi ** non è una buona pratica. –

+0

@yugantarkumar buona presa, non ho notato che le restanti chiavi hanno tutte preso oggetti dello stesso tipo, grazie per la modifica. – bersling

+0

Grazie a @bersling, è stato facile per me prendere, come ho fatto solo questa domanda. :) –

Problemi correlati