Ответ 1
Это не совсем то, что вы хотите, но вы можете использовать тип объединения:
interface IfcObject {
[key: string]: string | {
param1: number[];
param2: string;
param3: string;
}
}
У меня есть объект, где все ключи являются строками, некоторые из значений являются строкой, а остальные являются объектами в этой форме:
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".
Итак, как я могу выполнить проверку типов таких переменных?
Это не совсем то, что вы хотите, но вы можете использовать тип объединения:
interface IfcObject {
[key: string]: string | {
param1: number[];
param2: string;
param3: string;
}
}
правильный ответ на этот вопрос:
export interface IfcObjectValues {
param1: number[];
param2: string;
param3: string;
}
interface MyInterface {
fixedKey1: string,
fixedKey2: number,
[x: string]: IfcObjectValues,
}
Ваш код в действии, см. здесь.
Как объяснил @Paleo, вы можете использовать свойство union для определения интерфейса для вашего соответствующего объекта.
Я бы сказал, что вы должны определить интерфейс для значений объекта, а затем вы должны определить свой исходный объект.
sample Интерфейс может быть
export interface IfcObjectValues {
param1: number[];
param2: string;
param3: string;
}
export interface IfcMainObject {
[key : string]: string | IfcObjectValues;
}