Чому мій додаток React Native успішно створюється, незважаючи на помилку компілятора TypeScript?


15

Нещодавно я почав використовувати TypeScript з Expo. Я зробив усі інтеграції ліній / форматів, як, 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 "не визначено)»
Анар

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 вони насправді заявляють те саме:

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

Однак є деякі застереження щодо використання TypeScript з Babel. Оскільки підтримка TypeScript у Babel - це транспіляція, Jest не перевірятиме ваші тести під час їх запуску. Якщо ви цього хочете, ви можете використовувати ts-vice.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.