Przejdź do treści
webtype.orgwebtype.orgTS5055

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    TS5055

    Emisja na własne źródło

    Cannot write file 'src/app.js' because it would overwrite input file.

    Własne słowa kompilatora. Nietłumaczone — to ten ciąg, który wkleiłeś w wyszukiwarkę.

    Przy włączonym `allowJs` plik `.js` jest zarazem wejściem i nazwą wyjścia. Jeśli wyjście trafia tam, gdzie leży wejście, kompilator nadpisałby plik, który właśnie przeczytał.

    Odtworzenie

    // tsconfig.json
    {
      "compilerOptions": {
        "allowJs": true,
        "outDir": "src"
      }
    }
    
    // src/app.js — read as an input, and the exact path the emit would land on
    export const version = 1

    Build potwierdza, że to emituje dokładnie ten kod.

    Dlaczego kompilator tak mówi

    Nic innego w tym katalogu nie jest zgłaszane o pliku; to jest zgłaszane o budowaniu. `allowJs` wstawia `src/app.js` do programu jako źródło, a jego kompilacja daje JavaScript, który emiter chce nazwać `app.js` w `outDir` — czyli tą samą ścieżką. Kompilator nie zniszczy wejścia, by zadośćuczynić konfiguracji, więc odmawia przed zapisaniem czegokolwiek i cała emisja staje. Dlatego też w katalogu wyjściowym nic się nie pojawia: to nie ostrzeżenie o jednym pliku, to budowanie, które się nie odbyło.

    Naprawy

    1. 01
      // tsconfig.json
      {
        "compilerOptions": {
          "allowJs": true,
          "outDir": "dist"
        }
      }
      
      // src/app.js stays an input; the emit lands in dist/
      export const version = 1

      Daj wyjściu własny katalog. Wspólny folder wejść i wyjść to cały problem, a każde inne rozwiązanie wynika z ich rozdzielenia.

    2. 02
      // tsconfig.json
      {
        "compilerOptions": {
          "allowJs": true,
          "checkJs": true,
          "noEmit": true
        }
      }
      
      // src/app.js is checked and left exactly as it is
      export const version = 1

      Albo przestań emitować. Jeśli projekt buduje już bundler, TypeScript jest tu od sprawdzania — `noEmit` to mówi, a kolizja nie może powstać.

    Wniosek

    Zdecyduj, czy TypeScript buduje ten projekt, czy tylko go sprawdza. Ten błąd to najczęściej projekt, który odpowiedział na oba naraz.

    Błędy