Машинопись Тип параметра сигнатуры индекса должен быть либо "строка", либо "число" - PullRequest
0 голосов
/ 05 мая 2020

У меня есть generi c, тип которого по умолчанию - string:

interface EntityState<typeOfID = string> {
  entities: { [ id: typeOfID]: any };
}

Я получаю сообщение об ошибке:

An index signature parameter type must be either 'string' or 'number'.(1023)

Я также пробовал следующее:

interface EntityState<typeOfID extends string | number> {
  entities: { [ id: typeOfID]: any };
}

И не работает. Как решить?

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

В таком случае вы можете использовать Record.

Рассмотрим это:

export const enum MyEnumKeys {
  Key1 = 'key1',
}

interface EntityState<typeOfID> {
  entities: Record<typeOfID, any>;
}

const test: EntityState<MyEnumKeys> = {
  entities: {
    key1: 1,
    anotherKey: 2 // error here
  }
}

0 голосов
/ 05 мая 2020

В JavaScript (и, как таковой, TypeScript), ключи объекта всегда являются строками или Symbol Это то, что TypeScript пытается вам сказать: вы не можете установить тип ключа для чего-либо, кроме это.

Из документации разработчика Mozilla:

Обратите внимание, что все ключи в обозначении квадратных скобок преобразуются в строку, если они не являются символами, поскольку JavaScript имена свойств объекта (ключи) могут быть только строками или символами (в какой-то момент личные имена также будут добавлены по мере продвижения предложения полей класса, но вы не будете использовать их с формой []). Например, в приведенном выше коде, когда ключ obj добавляется к myObj, JavaScript вызовет метод obj.toString () и будет использовать эту строку результата в качестве нового ключа.

В вашем первом примере вы говорите, что тип ключа может быть любым, но обычно это строки. Это позволяет использовать логические значения, что недопустимо.

Во втором примере вы говорите, что тип ключа является надмножеством строки и чисел. Что по-прежнему недопустимо, поскольку типы все еще не могут гарантировать, что они могут быть преобразованы в строку. (т.е. null, который обычно имеет typeof (null) == "object", но не может быть преобразован в строку.)

Edit: Также разрешены числа , поскольку они гарантированно имеют уметь конвертировать в строку. Правильный термин для "stringify -able" - индексируемый.

Редактировать 2: Хотя JavaScript допускает использование символов в качестве ключей, TypeScript в настоящее время этого не делает. Вы можете прочитать обсуждение, начавшееся в 2015 году на репозиторий TypeScript на GitHub

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...