Typescript присваивает «Объекту» определенный тип вместо «любого»

#typescript #eslint

#машинописный текст #eslint

Вопрос:

Из-за проверок —strict_checks и typescript eslint я пытаюсь исправить некоторые новые ошибки в своем коде. Ниже приведены примеры кода для всего, что я объясняю. Допустим, у меня есть объект a, и я хочу напрямую указать его как карту, чтобы обойти некоторые ошибки. Я не могу использовать ключевое слово «любой». Это то, что я пытаюсь сделать:

 isEquivalent(a: Object, b: Object): boolean {
   const aObject: {[index: string]: Object} = a;
   const bObject: {[index: string]: Object} = b;
}
 

Ссылка на игровую площадку typescript с фактическим фрагментом кода: здесь
Но это выдает ошибку:

ошибка TS2322: тип ‘Object’ не может быть присвоен типу ‘{[index: string]: Object; }’. Тип «Объект» может быть присвоен очень немногим другим типам. Вы имели в виду использовать вместо этого тип «любой»? Подпись индекса отсутствует в типе «Объект».

Кто-нибудь может указать мне на решение для типа, чтобы указать объект как, без использования ‘any’? Или, если это невозможно, пожалуйста, дайте мне знать.

Комментарии:

1. Внесены изменения, которые вы просили.

Ответ №1:

const aObject: {[index: string]: Object} = a; присваивает a (типа Object ) aObject (типа {[index: string]: Object} , объекту со строковыми именами свойств и Object значениями свойств). Но Object не совместим с присваиванием {[index: string]: Object} , поэтому TypeScript выдает эту ошибку.

Если вы хотите принудительно выполнить это, вы можете выполнить утверждение типа:

 const aObj = a as {[index: string]: Object};
 

Обновлена ссылка на игровую площадку

Но имейте в виду, что утверждения типа в основном отключают проверку типов TypeScript. Вызывающий может передать {a: 42} , что не является a {[index: string]: Object} , и TypeScript разрешил бы это, потому что вы сказали, что параметр просто Object , но тогда вы рассматриваете его как {[index: string]: Object} .

Иногда это уместно, но вы могли бы рассмотреть возможность присвоения параметрам типа {[index: string]: Object} вместо использования утверждения типа внутри функции. Таким образом, TypeScript может гарантировать, что передаются только правильно введенные объекты.