#typescript
#typescript
Вопрос:
Вот простой пример, который меня смутил:
interface Test {
key1: string;
'attr.innerKey': string
}
const test: Test = {
key1: 'I am a key',
'attr.innerKey': 'innerKey'
}
test.key2 = 'I am key 2'; // here comes an error for there's no key2 in test
test['attr.innerKey2'] = 'error'; // Some how this works
Это так странно, что эта строка кода test['attr.innerKey2'] = 'error';
прошла.
Это ошибка или какая-то особая функция?
Ответ №1:
Это поведение компилятора по умолчанию. По умолчанию, чтобы упростить миграцию с JS, а также не нарушать существующий код, в typescript отключены большинство его более строгих функций.
Таким образом, динамический доступ к ключам (с использованием []
) всегда выполняется успешно, даже если компилятор знает, что типы предполагают, что он должен завершиться неудачей, и результатом этого доступа к индексу является any
. Статический доступ (ie .
) проверяется на соответствие типу и завершается ошибкой при несуществующих свойствах. Это было сделано так, как люди обычно используют .
для обычного доступа, но []
когда они хотят получить доступ к ключам динамически.
Вы можете сообщить компилятору, что хотите, чтобы он также проверял []
доступ, если вы используете опцию noImplicitAny
компилятора (хотя, если вы начинаете новый проект, я бы рекомендовал использовать strict
и отключать то, что вас особенно раздражает, или лучше ничего не отключать).
noImplictAny
Опция выявит множество других ошибок, таких как пропущенные типы параметров, поэтому ее включение в существующей базе кода обычно немного болезненно (по моему опыту, это единственное самое большое препятствие при преобразовании JS в TS), но результаты того стоят.