Так что я понял это. Эта история состоит из двух частей:
Причина, по которой я начал эту охоту goose, была из-за ошибки типа времени выполнения, когда свойство .reports
было undefined
. Но проблема здесь была не в TypeScript, а в том, что я печатал подсказку от сервера, фактически не проверяя, что данные имеют правильный тип. Так что да, .reports
был неопределенным, но тип .reports
сказал, что он не может быть неопределенным.
Но код Visual Studio говорит, что свойство может быть undefined
? Откуда он это знает и почему он не предупреждает меня при доступе к свойству .length
?
Оказывается, подсказка типа vscode неоднозначна. Это говорит о том, что выражение , которое я нахожу, это FilteredReport[] | undefined
, что не то же самое, что свойство , имеющее этот тип (я должен сказать, что я действительно так думаю похоже, что они представляют тип свойства там). Тип свойства на самом деле просто FilteredReport[]
, но из-за необязательной цепочки выражение может иметь значение FilteredReport[] | undefined
.
Я создал проблему для vscode, связанную с подсказкой: https://github.com/microsoft/vscode/issues/94348