определение произвольного типа дает: Свойство 'x' типа 'логическое' не может быть присвоено строковому индексу типа 'строка'

Найден решение на этом веб-сайте

Все, что вам нужно, это добавить следующее к вашему web.config


  
    
      
        
        
      
    
  

Дополнительная информация с Microsoft

2
задан Andre Elrico 19 March 2019 в 15:42
поделиться

2 ответа

Сообщение об ошибке вызвано тем, что тип 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 данного объекта, например:

[111 ]

Теперь давайте попробуем:

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 на приведенный выше код. Удачи!

0
ответ дан jcalz 19 March 2019 в 15:42
поделиться

Ваш тип определяется следующим образом:

  • Все свойства должны быть строкой или неким внутренним типом (InnerObj)
  • Свойства 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' };
0
ответ дан gilamran 19 March 2019 в 15:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: