2016-07-08 14 views
12

mam obiektu, gdzie wszystkie klucze są łańcuchami, niektóre wartości są ciąg, a reszta to obiekty w tej formie:Typescript interfejs dla obiektów o niektórych znanych i nieznanych nazw właściwości

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'}, 
    ... 
    ... 
}; 

W ten obiekt fixedKey1 i fixedKey2 są znanymi kluczami, które będą tam w tym obiekcie. unknownKey - para wartości może się różnić od 1-n.

Próbowałem definiowania interfejsu obiektu jako:

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

Ale to rzuca się następujący błąd:

Variable of type number is not assignable of type object

co uważam, że nie jest w stanie przypisać ten interfejs do " fixedKey - para wartości.

Jak mogę sprawdzić typ tego rodzaju zmiennych?

Odpowiedz

8

To nie jest dokładnie to, co chcesz, ale można użyć union type:

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

Jak @Paleo wyjaśnił można użyć właściwości Unii, aby zdefiniować interfejs dla odpowiedniego obiektu.

Powiedziałbym, że powinieneś zdefiniować interfejs dla wartości obiektu, a następnie powinieneś zdefiniować swój oryginalny obiekt.

próbka Interfejs może być

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

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

Prawidłowa odpowiedź na to pytanie brzmi:

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

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

Twój kod w akcji, see here.

+0

Tak, będzie to bardziej precyzyjne, ale nadal pisanie typu ** any ** nie jest dobrą praktyką. –

+0

@ yugantarkumar dobry połów, nie zauważyłem, że pozostałe klucze wszystkie miały przedmioty tego samego rodzaju, dzięki za edycję. – bersling

+0

Dzięki @bersling, Łatwo było mi złapać, ponieważ zadałem tylko to pytanie. :) –

Powiązane problemy