Я хочу создать интерфейс для состояния компонента, который выглядит так:
interface ComponentState {
booleanProperty: boolean
[unspecifiedKey: string]: {
[name: string]: string
}
}
Это тоже не сработает
interface UnspecifiedKey { [name: string]: string }
interface ComponentState {
booleanProperty: boolean
[unspecifiedKey: string]: UnspecifiedKey
}
Мое состояние выглядит так:
this.state = {
booleanProperty: true
whatever: {value: ''}
}
И я получаю сообщение об ошибке:
Property 'booleanProperty' of type 'boolean' is not assignable to string index type '{ [name: string]: string; }'.
Error TypeScript Type '{ whatever: { value: string; }; booleanProperty: true; }' is not assignable to type 'Readonly'. Property 'booleanProperty' is incompatible with index signature. Type 'true' is not assignable to type '{ [name: string]: string; }'.
Typescript не выдает ошибку только тогда, когда мое состояние выглядит следующим образом
interface ComponentState {
[unspecifiedKey: string]: {
[name: string]: string
} | boolean
}
Однако я считаю это решение некрасивым. Есть идеи, как сделать интерфейс более аккуратным?





для быстрого исправления вы можете использовать
interface ComponentState {
booleanProperty: boolean,
\[unspecifiedKey: string]: any
}
Как описано в машинописном тексте [docs] [1], если вы используете индексируемые свойства, тогда весь возвращаемый тип всех других свойств должен быть назначен типу возвращаемого типа возвращаемого типа индекса. Это потому, что foo ['bar'] и foo.bar одинаковы. [1]: typescriptlang.org/docs/handbook/… в вашем случае есть только «любой» как решение. (Не знаю, как добавить ссылку в комментарий) Это был один из ответов. Это не имеет никакого отношения к необходимому реквизиту.
Это должен быть ваш ответ, а не комментарий. :) Проверял как решено.
Боюсь, вы не связали ответ с моим вопросом. Все заявленные мною свойства обязательны. Объект с неопределенными ключами должен появиться хотя бы один раз. И я не могу их использовать, потому что мне нужно описать его структуру.