Почему мое приложение React Native успешно создается, несмотря на ошибку компилятора TypeScript?

15

Я недавно начал использовать TypeScript с Expo. Я сделал все интеграции linter / formatter так, typescript-eslintчтобы я мог отлавливать большинство ошибок во время кодирования. Чтобы проверить, компилируется ли код, я запускаю npx tscвремя от времени и исправляю соответственно.

Одна вещь, которую я до конца не понял, - это то, почему мое приложение успешно собирается, даже если есть многочисленные ошибки компиляции. Я ожидаю (и предпочитаю) видеть ошибку красного экрана для каждой ошибки компиляции, а не успешную сборку приложения, и я узнаю об этом позже. Например,

function square<T>(x: T): T {
  console.log(x.length); // error TS2339: Property 'length' does not exist on type 'T'.
  return x * x;
}

типичная ошибка TypeScript, которую (я полагаю?) можно легко проверить во время компиляции. Я хочу, чтобы это привело к большой красной ошибке на экране и сборке не удалось.

Я совершенно новичок в TypeScript, поэтому, возможно, мне не хватает чего-то очень важного. Что именно вызывает эту снисходительность и есть ли способ обеспечить более строгие проверки?

Анар
источник
Под "успешной сборкой" вы имеете в виду, что JS все равно выводится, или в какой-то момент сообщение об ошибке компилятора не отображается?
ecraig12345
2
Я имею в виду, что JS все равно выводится, и я могу запустить приложение в режиме разработки и даже без проблем собрать производственное приложение. Я ожидал, что TypeScript предотвратит это во время компиляции. Сообщения об ошибках компилятора всегда отображаются при запуске, npx tscно я хочу получить красный экран для каждой ошибки TypeScript, так же как я делаю это для обычных ошибок JS, таких как, const n = 23; n.reverse();что приводит к красному экрану с сообщением «n.reverse не является функцией. (В 'n.reverse ()', 'n.reverse' не определено) "
anar
2
Я тоже нахожу это таким странным. Я тоже не могу найти адекватного решения.
Саймон Бенгтссон

Ответы:

2

Первое, что нужно понять, это то, что Typescript - это расширенный набор Javascript, и в этом случае он фактически не проверяется типом во время компиляции.

По сути дела, Babel просто удаляет Typescript и преобразует его в Javascript, который затем компилируется в пакеты js.

Вы можете взглянуть на первую строку следующих документов Babel, а также предостережения: https://babeljs.io/docs/en/next/babel-plugin-transform-typescript

Поскольку Babel не проверяет тип, код, синтаксически правильный, но не прошедший проверку типа TypeScript, может быть успешно преобразован, и часто непредвиденными или недействительными способами.

Я бы предложил расширить вашу команду сборки, чтобы сначала включить tscили, вернее, компиляцию noEmitTypescript с установленным значением true в вашем tsconfig.

Обновление : я нашел другой случай, когда это применяется недавно при добавлении jestи typescriptк проекту. В нижней части Jest Docs они фактически утверждают одно и то же:

https://jestjs.io/docs/en/getting-started#using-typescript

Однако есть некоторые предостережения относительно использования TypeScript с Babel. Поскольку поддержка TypeScript в Babel - это транспиляция, Jest не будет проверять ваши тесты по мере их запуска. Если вы хотите этого, вы можете использовать ts-jest.

Марк Аткинсон
источник