Interfață Typescript pentru obiecte cu unele nume de proprietăți cunoscute și altele necunoscute


Am un obiect în care toate cheile sunt stringuri, unele dintre valori sunt stringuri, iar restul sunt obiecte în această formă:

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

În acest obiect fixedKey1 și fixedKey2 sunt cheile cunoscute care vor fi prezente în acel obiect. Perechea unknownKey - valoare poate varia de la 1 la n.

Am încercat să definesc interfața obiectului ca:

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

Dar acest lucru generează următoarea eroare:

Variabila de tip număr nu poate fi atribuită unui tip obiect

Pe care am descoperit că nu poate aloca această interfață la perechea „cheie fixă - valoare”.

Deci, cum pot face verificarea tipului pentru acest tip de variabile?

Răspuns #1

Nu este exact ceea ce vrei, dar poți folosi un tip de uniune:

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

Acesta acoperă cazul tău. Dar proprietățile necunoscute ar putea fi de tip string.

Răspunsul #2

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

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

Codul tău în acțiune, vezi aici.

Răspunsul #3

Așa cum a explicat @Paleo, poți folosi proprietatea union pentru a defini o interfață pentru obiectul tău corespunzător.

Aș spune că ar trebui să definești o interfață pentru valorile obiectului și apoi ar trebui să îți definești obiectul original.

Interfața de exemplu poate fi:

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

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