Подтвердить что ты не робот

Typescript интерфейс для объектов с известными и неизвестными именами свойств

У меня есть объект, где все ключи являются строками, некоторые из значений являются строкой, а остальные являются объектами в этой форме:

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

В этом объекте fixedKey1 и fixedKey2 находятся известные ключи, которые будут присутствовать в этом объекте. unknownKey - пара значений может варьироваться от 1-n.

Я попытался определить интерфейс объекта как:

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

Но это вызывает следующую ошибку:

Переменная номера типа не присваивается объекту типа

Что я узнал, что он не может назначить этот интерфейс паре "fixedKey - value".

Итак, как я могу выполнить проверку типов таких переменных?

4b9b3361

Ответ 1

Это не совсем то, что вы хотите, но вы можете использовать тип объединения:

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

Ответ 2

правильный ответ на этот вопрос:

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

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

Ваш код в действии, см. здесь.

Ответ 3

Как объяснил @Paleo, вы можете использовать свойство union для определения интерфейса для вашего соответствующего объекта.

Я бы сказал, что вы должны определить интерфейс для значений объекта, а затем вы должны определить свой исходный объект.

sample Интерфейс может быть

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

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