Найден решение на этом веб-сайте
Все, что вам нужно, это добавить следующее к вашему web.config
Дополнительная информация с Microsoft
Сообщение об ошибке вызвано тем, что тип btnWrap
boolean
не соответствует типу индекса строки string
. Тип {[key: string]: string, btnWrap: boolean}}
пытается сказать, что каждое свойство имеет строковое значение и , что btnWrap
имеет логическое значение. Оба не могут быть правдой, поэтому компилятор предупреждает вас.
Нет ни одного конкретного типа MyObj
, который представлял бы ограничение, как вы его описали. Но вы можете создать универсальный тип , который принимает объединение ключевых литералов K
и создает тип MyObj<K>
:
type MyObj<K extends keyof any> =
{ [P in K]: string | (Record<P, string> & { btnWrap: boolean }) };
Тип MyObj<K>
] является отображенным типом , где каждое свойство с ключом P
имеет либо тип значения string
, либо пересечение из {btnWrap: boolean}
с Record<P, string>
. Последний тип сам по себе является отображенным типом (, определенным в стандартной библиотеке ) с ключами P
и свойствами string
. Таким образом, каждое свойство MyObject<K>
должно выглядеть как someKey: string
или someKey: {btnWrap: boolean, someKey: string}
.
Опять же, чтобы описать тип myObj
, вместо чего-то простого, такого как let myObj: MyObj = ...
, вы должны сделать что-то вроде let myObj: MyObj<"key1"|"key2"|"key3"> = ...
, где вы указываете общие параметры. Чтобы вам не пришлось делать это самостоятельно, вы можете использовать универсальную вспомогательную функцию, чтобы помочь вывести тип K
данного объекта, например:
Теперь давайте попробуем:
let myObj1 = asMyObj({ key1: 'val1', key2: 'val2', key3: 'val3' });
let myObj2 = asMyObj({ key1: 'val1', key2: { key2: 'val2', btnWrap: true }, key3: 'val3' });
Те работают просто отлично. Теперь давайте посмотрим, что пойдет не так, если вы нарушите свое ограничение:
let badMyObj1 = asMyObj({ key1: 1 });
// error, number is bad
let badMyObj2 = asMyObj({ key1: "val1", key2: { key2: "val2" } });
// error, missing btnWrap
let badMyObj3 = asMyObj({ key1: "val1", key2: { btnWrap: true } });
// error, missing key2 inside value
let badMyObj4 = asMyObj({ key1: "val1", key2: { key3: "val3", btnWrap: true } });
// error, key3 not expected inside value
Эти ошибки, вероятно, то, что вы хотите увидеть, верно?
Хорошо, надеюсь, это поможет. Вот ссылка Playground на приведенный выше код. Удачи!
Ваш тип определяется следующим образом:
InnerObj
) Вот как это определить:
type InnerObj = {
[key: string]: string | boolean;
btnWrap: boolean;
};
type Obj = {
[key: string]: string | InnerObj;
}
const myObj1: Obj = { key1: 'val1', key2: 'val2', key3: 'val3' };
const myObj2: Obj = { key1: 'val1', key2: { key2: 'val2', btnWrap: true }, key3: 'val3' };