Странное поведение интерфейса

#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), но результаты того стоят.