Я заметил неожиданные типы при использовании объектов с переменными ключами в TypeScript.
Учитывая следующий код
type MyType = {
[x: number] : number
}
const o : MyType = {
0: 1,
}
const a = o[0]; // Return type correctly identified as number
const b = o[1]; // Return type should be undefined and compiler should not allow this
Я заметил, что тип доступа к объекту с использованием [...]
не правильно определяется, когда тип объекта определен с использованием синтаксиса [x: number]
для переменных ключей.
VSCode показывает, что оба типа a
и b
имеют тип number
. Вместо этого тип должен быть number | undefined
, потому что может случиться так, что ключ не определен? При регистрации a
и b
на консоли a
представляет собой number
, а b
- undefined
.
Проблема становится более серьезной, когда объект типа MyType
передается функции, и эта функция обращается к ключу в этом объекте, а затем делает что-то вроде этого:
function fun(o: MyType) : number {
return o[10000] ?? null // can be number or null at runtime
}
Ошибка не отображается. Но когда код выполняется, o[10000]
не определено, и поэтому возвращаемое значение равно null
, что не является допустимым числом. Представьте себе использование этого возвращаемого значения для выполнения дальнейших вычислений, которые все основаны на предположении, что это допустимое число. Это может привести к ошибкам во время выполнения, которые должны были быть обнаружены компилятором (если я не совсем понимаю, что-то не так, я новичок в TS)
(TypeScript, используемый в этих примерах, настраивается командой create-реагировать приложение, я не менял никаких настроек)