Почему доступ к свойству indexOf все еще компилируется? - PullRequest
0 голосов
/ 18 января 2019

Я сделал опечатку в TypeScript, которая была обнаружена во время проверки кода.

Я использовал someArray.indexOf[someObject] вместо someArray.indexOf(someObject).

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

Может кто-нибудь объяснить это?

Ответы [ 4 ]

0 голосов
/ 19 января 2019

Единственная реальная проблема заключается в том, что вы ожидаете, что Typescript выдаст ошибку, которая выявила проблему в вашей логике. Предполагаемая логика заключалась в использовании фигурных скобок и использовании функции someArray.indexOf(someObject).

То, что произошло, когда вы использовали квадратные скобки, someArray.indexOf[someObject], было то, что среда выполнения JS сначала преобразовала ваш объект someObject в строку, вызвав функцию someObject.toString, которая, скорее всего, вернула "[object object]". Затем объект someArray.indexOf был запрошен для ключа "[object object]", который не присутствовал, возвращая undefined. Что касается Typescript, это вполне нормально.

Дэвид Шеррет отметил, что --noImplicitAny указал бы на ошибку, но он бы только указал на другую ошибку, как он объяснил, которая не помогла бы вам напрямую найти ошибку в вашей логике.

0 голосов
/ 18 января 2019

Довольно просто.

someArray.indexOf вы знаете, что это function, который также является объектом и может иметь свойства.

Делая someArray.indexOf[someObject], вы пытаетесь достичь свойства с ключом, оцененным в значение someObject.

Конечно, он не определен в функции indexOf, поэтому возвращает undefined.

Быстрый пример, иллюстрирующий синтаксис и тот факт, что функция может иметь свойства;):

const array = [];
array.indexOf['anyValue'] = 'test';
console.log(array.indexOf.anyValue);

EDIT

Вот попытка ответа на вопрос, связанный с TypeScript.

Как вы уже знаете, TypeScript разработан для совместимости с JavaScript. Следовательно, как и в JS, вы можете получить доступ к свойству объекта следующими способами:

  • «Статически»: obj.property
  • «Динамически»: obj['property']

Используя статический способ доступа к свойству, конечно, TypeScript вызовет ошибку!

Но при динамическом способе доступа к свойству компилятор TypeScript не сможет определить его тип или, если он существует, или нет, так как значение в скобках будет оцениваться во время выполнения после переноса TypeScript.

Вот почему он будет неявно помечен как any.

Как отметил Дэвид Шеррет в своем ответе , вы можете заставить TypeScript выдавать ошибку, добавив флаг --noImplicitAny, пожалуйста, обратитесь к его ответу для получения более подробной информации об этом!

Надеюсь, это поможет;)

0 голосов
/ 18 января 2019

Это не ошибка, потому что опция компилятора --noImplicitAny не включена. При включенной опции компилятора вы получите сообщение об ошибке:

noImplicitAny enabled

Причина в том, что выражение доступа к элементу возвращает объект, типизированный как any, когда для типа не определена индексная сигнатура (это неявное any).

enter image description here

Опять же, так как --noImplicitAny не включен, это не ошибка. Я настоятельно рекомендую включить этот параметр компилятора.

0 голосов
/ 18 января 2019

array.indexOf - это функция.

Функции являются объектами.

Вы обращались к свойству someObject функции array.indexOf.

Вы бы получили undefined.

const array = [1, 2, 3]
const someObject = 'asdasd'

console.log(array.indexOf[someObject])
// undefined
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...