В JavaScript (и, как таковой, TypeScript), ключи объекта всегда являются строками или Symbol Это то, что TypeScript пытается вам сказать: вы не можете установить тип ключа для чего-либо, кроме это.
Из документации разработчика Mozilla:
Обратите внимание, что все ключи в обозначении квадратных скобок преобразуются в строку, если они не являются символами, поскольку JavaScript имена свойств объекта (ключи) могут быть только строками или символами (в какой-то момент личные имена также будут добавлены по мере продвижения предложения полей класса, но вы не будете использовать их с формой []). Например, в приведенном выше коде, когда ключ obj добавляется к myObj, JavaScript вызовет метод obj.toString () и будет использовать эту строку результата в качестве нового ключа.
В вашем первом примере вы говорите, что тип ключа может быть любым, но обычно это строки. Это позволяет использовать логические значения, что недопустимо.
Во втором примере вы говорите, что тип ключа является надмножеством строки и чисел. Что по-прежнему недопустимо, поскольку типы все еще не могут гарантировать, что они могут быть преобразованы в строку. (т.е. null, который обычно имеет typeof (null) == "object", но не может быть преобразован в строку.)
Edit: Также разрешены числа , поскольку они гарантированно имеют уметь конвертировать в строку. Правильный термин для "stringify -able" - индексируемый.
Редактировать 2: Хотя JavaScript допускает использование символов в качестве ключей, TypeScript в настоящее время этого не делает. Вы можете прочитать обсуждение, начавшееся в 2015 году на репозиторий TypeScript на GitHub