Почему доступ к свойству indexOf все еще компилируется?

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

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

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

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

Ответ 1

Довольно легко.

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

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

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

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

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

Ответ 2

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

noImplicitAny enabled

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

enter image description here

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

Ответ 3

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

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

Вы someObject свойству array.indexOf функции array.indexOf.

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

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

console.log(array.indexOf[someObject])
// undefined

Ответ 4

Вкратце: потому что так устроен язык.

JavaScript оценивает попытку доступа к свойству, которое не существует, как undefined.

Это не вызывает исключения.

Ответ 5

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

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

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

Ответ 6

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

Когда вы Array.indexOf() доступ к функции Array.indexOf() через скобку Array.indexOf['prop'] вы фактически пытаетесь получить доступ к свойству, которого нет в indexOf поэтому вы получаете undefined.