Typescript ошибка "Невозможно записать файл... потому что он будет перезаписывать входной файл".

В моем проекте Typescript 2.2.1 в Visual Studio 2015 Update 3 я получаю сотни ошибок в списке ошибок, например:

Невозможно записать файл 'C:/{{my-project}}/ node_modules/buffer-shims/index.js', потому что он перезапишет входной файл.

Кажется, это все время. Это фактически не препятствует построению, и все работает отлично, но список ошибок отвлекает и трудно найти "реальные" ошибки, когда они происходят.

список ошибок в Visual Studio

Вот мой tsconfig.json файл

{
  "compileOnSave": true,
  "compilerOptions": {
    "baseUrl": ".",
    "module": "commonjs",
    "noImplicitAny": true,
    "removeComments": true,
    "sourceMap": true,
    "target": "ES5",
    "forceConsistentCasingInFileNames": true,
    "strictNullChecks": true,
    "allowUnreachableCode": false,
    "allowUnusedLabels": false,
    "noFallthroughCasesInSwitch": true,
    "noImplicitReturns": true,
    "noImplicitThis": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,

    "typeRoots": [],
    "types": [] //Explicitly specify an empty array so that the TS2 @types modules are not acquired since we aren't ready for them yet.
  },
  "exclude": ["node_modules"]
}

Как я могу избавиться от всех этих ошибок?

Ответ 1

Кажется, эта проблема была исправлена ​​для меня, обновив ее до Typescript 2.3.x

Кроме того, использование Visual Studio 2017 также значительно улучшилось. Я настоятельно рекомендую вам сделать оба этих обновлений.

Ответ 2

У меня такая же проблема. В моем случае это было результатом опции: allowJs: true.

Так что я просто должен был удалить эту строку, чтобы избавиться от ошибок. Я не вижу его в вашем коде, но, возможно, вам это помогает.

Удачи!

Ответ 3

В моем экземпляре я использовал параметр outFile, но не исключая каталог назначения из входов.

// Bad
{
    "compileOnSave": true,
    "compilerOptions": {
        "outDir": "./built",
        "allowJs": true,
        "target": "es5",
        "allowUnreachableCode": false,
        "noImplicitReturns": true,
        "noImplicitAny": true,
        "typeRoots": [ "./typings" ],
        "outFile": "./built/combined.js"
    },
    "include": [
        "./**/*"
    ],
    "exclude": [
        "./plugins/**/*",
        "./typings/**/*"
    ]
}

Все, что нам нужно сделать, это исключить плюсы в outDir:

// Good
{
    "compileOnSave": true,
    "compilerOptions": {
        "outDir": "./built",
        "allowJs": true,
        "target": "es5",
        "allowUnreachableCode": false,
        "noImplicitReturns": true,
        "noImplicitAny": true,
        "typeRoots": [ "./typings" ],
        "outFile": "./built/combined.js"
    },
    "include": [
        "./**/*"
    ],
    "exclude": [
        "./plugins/**/*",
        "./typings/**/*",
        "./built/**/*" // This is what fixed it!
    ]
}

Ответ 4

Добавление 'dist' в исключенные каталоги в tsconfig.json сработало для меня:

{
  "exclude": ["node_modules", "dist"]
}

Ответ 5

Установить OutDir.

"outDir": "./",

Этот намек заключается в том, что если вы не установите outDir, то вывод будет размещен непосредственно рядом с входным файлом. После allowJs файл JavaScript также будет скомпилирован. Затем скомпилированный файл JavaScript перезапишет ваш исходный файл. Это просто напоминает тебе об этом.

Ответ 6

Добавление "outDir": "./dist" к compilerOptions в tsconfig.json сработало для меня, когда я получил эту ошибку. Я уверен, что это только расширение Visual Studio Code TypeScript, выводящее эту ошибку. Я использую ts-загрузчик с Webpack, а не компилятор tsc напрямую, поэтому мне не пришлось указывать outDir, потому что это контролирует конфиг webpack, но если это делает расширение VS Code счастливым, то это хорошо.

Ответ 7

Есть несколько возможных причин этого.

  • В вашем tsconfig.json:
    • Задайте для outDir значение "dist" или имя другой папки того же уровня. (префикс "./" не нужен). Это где файлы сборки идут.
    • Установите для allowJs значение false или удалите строку. Примечание: включено, allowJs будет конфликтовать с настройкой/флагом объявления. Это не включено по умолчанию.
    • Включите "dist" (или вашу папку сборки) в exclude.
  • В вашем package.json:
    • Установите main на "index" или другое выбранное имя. Не добавляйте префикс к папке сборки (например, "dist/index") и к ненужным "./".
    • Установите types (современный псевдоним typings) в "index". Добавлять расширения (.d.ts или .js) не нужно.

Хотя вы можете использовать его миллионами разных способов, для простоты и развития понимания лучше всего сначала придерживаться общепринятых методов - например, использовать "dist", простые файлы tsconfig.json и package.json на одном уровне дерева., и так далее. Конечно, рутирование через файлы ваших node_modules также углубит ваше понимание, но в жизни есть более полезные вещи.

Ответ 8

У меня тоже была эта проблема. В моем случае я восстановил исходную версию файла \tools\JsEngine\typescriptServices.js и это решило проблему.

Я обнаружил, что typescriptServices.js был изменен Visual Studio из-за конца строки (CRLF or CR), и после этого VS не может правильно его запустить.

Ответ 9

Я решил это, удалив "declaration": true из моего файла tsconfig.json. Хотя сейчас у меня больше нет объявлений, так что это не помогло.

Ответ 10

Вероятно, причиной проблемы являются 2 файла, генерирующие один и тот же модуль. Поэтому, если в одной папке два файла с одинаковыми именами, но с разными расширениями, это приводит к этой ошибке.

например:

\index.ts
\index.tsx

Решение заключается в изменении одного из этих файлов на другое.

Ответ 11

В моем случае из-за разработки библиотеки и приложения одновременно...

Перемещение файла, который имеет импорт из библиотеки, из приложения в библиотеку привел к тому, что файл, находящийся сейчас в библиотеке, будет импортировать материал из своей собственной папки dist.

Забавно, что... на самом деле это рефакторинг в лучшем виде... он сохранил правильную ссылку на файл :)

Ответ 12

Я была такая же проблема. В моем случае это было вызвано тем, что у меня было два файла с одинаковым именем в одном модуле: index.ts index.tsx.

Я переименовал один из них, и проблема была исправлена.

Ответ 13

Я столкнулся с этой проблемой из-за автозаполнения VSCode файла в папке dist/.

import { SomeClass } from '../../dist/xxx/someclass' 

Чтобы решить проблему, просто исправьте импорт:

import { SomeClass } from './someclass'