необязательная подпись индекса в typescript

#typescript

#typescript

Вопрос:

Я хочу иметь возможность использовать такой тип:

 export interface NodesState {
  attr1: number;
  attr2: number;
  attr3: number;
}
  

И предоставить пользователю возможность использовать пространство имен типа.

Так что это законно:

 {
  namespace1: {
    attr1: 100,
    attr2: 150,
    attr3: 200
  },
  namespace2: {
    attr1: 300,
    attr2: 400
  }
}
  

Но она также легальна без пространств имен:

 {
  attr1: 200,
  attr2: 100,
  attr3: 200
}
  

Я пробовал это:

 export type MakeState<T> = T amp; {
  [key: string]?: Partial<T>
}
  

Но это недопустимый typescript.

Возможно ли то, что я пытаюсь сделать?

Ответ №1:

Если я правильно понимаю, это то, что вы ищете:

 type MakeState<T> = T amp; { [index: string]: T }
  

Использование:

 declare const state: MakeState<NodesState>;

state.attr1;       // `number`
state["foo"]       // `NodesState`
  

Игровая площадка TypeScript