Как сделать динамические объекты в TypeScript

Можно ли определить тип динамического объекта в TypeScript? В следующем примере я хотел бы определить тип для "My Complex Type", сказав:

Объекты типа "Мой сложный тип" - это объекты, имеющие "любое количество свойств", но значения этих свойств должны быть типа IValue.

// value interface
interface IValue {
    prop:string
}

// My Complex Type
myType = {
    field1:IValue
    field2:IValue
    .
    .
    .
    fieldN:IValue
}

// Using My Complex Type 

interface SomeType {
    prop:My Complex Type
}

Ответ 1

Да, такое поведение может быть достигнуто, но несколько иначе. Вам просто нужно использовать интерфейс typescript, например:

interface IValue {
    prop: string
}

interface MyType {
    [name: string]: IValue;
}

который будет использоваться, например, как:

var t: MyType = {};
t['field1'] = { prop: null };
t['field2'] = new DifferentType(); // compile-time error
...
var val = t['field1'];
val.prop = 'my prop value';

Вам не нужно создавать класс typescript. Все, что вам нужно, это обычный javascript-объект (в этом случае {}) и заставить его реализовать интерфейс MyType, поэтому он ведет себя как словарь и предоставляет вам тип времени компиляции безопасность.