Чому помилка --isolatedModules виправляється будь-яким імпортом?


140

У проекті машинопису create-response-app я намагався написати це лише для швидкого тестування деяких речей:

// experiment.test.ts
it('experiment', () => {
  console.log('test');
});

Але це видає мені таку помилку, з червоним криво внизу it:

Усі файли повинні бути модулями, якщо встановлено прапорець '--isolatedModules'.

Однак якщо я зміню файл на такий, то, мабуть, все в порядку (крім невикористаного імпорту, звичайно):

// experiment.test.ts
import { Component} from 'react'; // literally anything, don't even have to use it

it('test', () => {
  console.log('test');
});

Чому? Що тут відбувається? Що --isolatedModulesнасправді означає / роби?


Якщо ви використовуєте importабо exportте , що файл є модулем ES6. Ваш найкращий приклад проблематичний, оскільки itвін ніде не визначений, у модульній архітектурі вам потрібно буде itдесь імпортувати
— apokryfos

Відповіді:


268

Typescript розглядає файли без імпорту / експорту як застарілі файли сценаріїв. Оскільки такі файли не є модулями, і будь-які їх визначення об'єднуються у глобальному просторі імен. isolatedModulesзабороняє такі файли.

Додавання будь-якого імпорту чи експорту до файлу робить його модулем, і помилка зникає.

Також export {}це зручний спосіб зробити файл модулем, не імпортуючи нічого.


Дякую, так просто, але коли ви створюєте свій перший тест, ви здивовані помилкою.
— Хуангі Джордан

2
@ JuanguiJordán так легко, так неправильно. Якщо ви не хочете, isolatedModulesпросто встановіть їх на false.
— Войцех Беднарський

Дякую @WojciechBednarski, але чи можете Ви трохи детальніше розказати свою відповідь?
— Хуангі Джордан

2
@ JuanguiJordán Ну, це все одно, що додати якесь правило, а потім ігнорувати його, додаючи @ts-ignore. Це export {}просто інший синтаксис, спосіб обходу правила, але в принципі саме такий.
— Войцех Беднарський

3
Я не бачу проблеми із загальними правилами, яких дотримуються 99% часу, але які іноді потрібно порушувати. Потрібно "порушувати правило", якщо правило загалом є добрим, це змушує мене думати про те, що я роблю, і обміркувати, чи є кращі способи щось вирішити. А іноді немає. Як у цьому випадку, коли я просто робив тестовий файл, щоб щось спробувати.
— Свіш

25

Правильний спосіб - це сказати TypeScript, що ви хочете. Якщо ви не хочете isolatedModulesстворювати tsconfig.jsonвсередині вашого testкаталогу та додавати:

{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "isolatedModules": false
  },
}

Додавання "isolatedModules": trueдо конфігурації, а потім обман перевірки TypeScript, додаючи export {}мені порожній код із запахом.


як пояснюється в інших коментарях, у цьому конкретному випадку це не буде зараховуватися як запах коду, тут це необхідність, оскільки немає іншого способу частково виключити якийсь файл із правила isolutedModules
— Vijay Jain

Хм, коли я перетворюю значення true на false, мені відповідають у відповідь: TypeError: Не вдається призначити для читання лише властивість 'isolatedModules' об'єкта '# <Object>' у verifyTypeScriptSetup
— Jerry Asher

@JerryAsher те саме тут, людина, але це працювало раніше, і тоді я повернув якийсь код і спробував його запустити, саме тоді я отримав точно таку ж помилку.
— Ганеш Кумар,


1

Спробуємо перевірити ізольовані модулі. Коли я перевірив Google, прямого контексту цього немає.

Це в основному означає, що ви дозволяєте Typescript компілювати модулі ізольовано.

Але це походить від Typescript і має щось спільне з Typescript, віддаючи перевагу модулям над просторами імен.

Модулі також мають залежність від завантажувача модулів (наприклад, CommonJs / Require.js) або середовища виконання, яке підтримує модулі ES. Модулі забезпечують краще повторне використання коду, сильнішу ізоляцію та кращу підтримку інструментальних засобів для пакетування.

Джерело 1

Використовуючи проект create-response-app typecript, вам слід встановити typecript і ts-jest (або create-response-app повинен обробляти залежності на основі того, ви викинули програму чи ні).

Також ts-jestмає деяку інформацію про це:

За замовчуванням ts-jest використовує компілятор TypeScript у контексті проекту (вашого) із повною перевіркою типу та функціями. Але він також може бути використаний для компіляції кожного файлу окремо , що TypeScript називає "ізольованим модулем". Ось що робить параметр isolatedModules (який за замовчуванням має значення false).

Джерело 2

Як тільки ви використовуєте exportкоманду, ви створюєте модуль з того, що експортується.

Якщо ви використовуєте ts-jest, ви можете додати ці налаштування, не впливаючи на інші модулі, з яких складатиметься програма create-response-app.

"ts-jest": {
  "isolatedModules": false
}

І перевірте сторінку ts-jest (друге джерело) на плюси та мінуси.


0

Усе ще виникають помилки, незважаючи на те, що ви експортуєте речі з цього "файлу помилок"?

  1. Check if you don't export same name that you already export in another file (конфлікт)
  2. After your fix try to stop and start your npm/yarn runner (Я відчував, що він не може відновити себе навіть після важкого перезавантаження сторінки, особливо коли у вас є десь інша помилка)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.