打字稿编译器无法跳过导入的js文件
Typescript compiler can't skip imported js file
我刚开始用 angular2 打字,我 运行 遇到了以下问题。
我从 angular2 quickstart 项目开始,它运行良好,直到我尝试导入一个普通的 javascript 文件。
我正在使用如下导入语句
import * as myModule from './mymodule.js';
我还添加了 allowJs: true
到 tsconfig.json 文件以接受 javascript 文件作为导入。
编译器给出以下错误:
error TS5055: Cannot write file '.../mymodule.js' because it would overwrite input file.
据我所知,typescript 编译器不应编译此文件,因为它已经在 javascript 中,但出于某种原因,我无法将其排除在编译之外。
我尝试将文件添加到 tsconfig.json 中的 exclude: []
数组,但是因为它是在我的一个 .ts 文件中导入的,所以没有考虑到这一点(至少我是这么理解的来自打字稿文档)。
我的问题是如何编译包含该文件的项目?有没有我缺少的设置?还是我的方法有问题?
感谢任何帮助或建议,因为这开始让我发疯
附加信息
我正在使用以下 tsconfig 文件:
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"lib": [ "es2015", "dom" ],
"noImplicitAny": true,
"suppressImplicitAnyIndexErrors": true
}
}
我正在构建我的项目运行正在
npm run build
从控制台。 package.json 文件中的脚本如下所示:
"scripts": {
"build": "tsc -p src/",
...
下面@Seamus建议的修改后,出现同样的错误。
但是
如果我只是 运行 在控制台中
tsc -p src/
我得到的错误是不同的:
error TS7016: Could not find a declaration file for module 'mymodule'
这看起来像是找到了模块,如果我手动执行的话,但问题是,为什么它不能与 npm run build
一起使用?它在做一些不同的事情吗?
编译器选项 allowJs 将:
Allow JavaScript files to be compiled.
对于commonjs
,您需要这样的模块声明:
mymodule.d.ts
declare module "mymodule";
并且在您导入的来源中:
/// <reference path="mymodule.d.ts"/>
import * as myModule from 'mymodule';
好吧,我知道这已经过时了,但我遇到了这个问题,我想我找到了解决方法(可能部分是由于 Angular 更新)。
开始:
- 将您的 Angular 升级到最新版本 (
5.1
)。
- 将您的 TypeScript 升级到支持的最新版本(
4.*
,截至撰写本文时 -- 不是 5.*
)
- 您的配置文件中可能需要
allowJs: true
。
运行 ng serve --aot
或 ng build --watch=auto --aot
您应该看到上述错误并且无法访问您的站点。
打开您的应用程序中的一个 .ts 文件并进行小的更改(例如添加一个 space),然后保存文件。
您的应用应该可以编译!
(据我所知,--watch=auto
和 --aot
标志对于此解决方法至关重要)
我刚开始用 angular2 打字,我 运行 遇到了以下问题。 我从 angular2 quickstart 项目开始,它运行良好,直到我尝试导入一个普通的 javascript 文件。 我正在使用如下导入语句
import * as myModule from './mymodule.js';
我还添加了 allowJs: true
到 tsconfig.json 文件以接受 javascript 文件作为导入。
编译器给出以下错误:
error TS5055: Cannot write file '.../mymodule.js' because it would overwrite input file.
据我所知,typescript 编译器不应编译此文件,因为它已经在 javascript 中,但出于某种原因,我无法将其排除在编译之外。
我尝试将文件添加到 tsconfig.json 中的 exclude: []
数组,但是因为它是在我的一个 .ts 文件中导入的,所以没有考虑到这一点(至少我是这么理解的来自打字稿文档)。
我的问题是如何编译包含该文件的项目?有没有我缺少的设置?还是我的方法有问题?
感谢任何帮助或建议,因为这开始让我发疯
附加信息
我正在使用以下 tsconfig 文件:
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"lib": [ "es2015", "dom" ],
"noImplicitAny": true,
"suppressImplicitAnyIndexErrors": true
}
}
我正在构建我的项目运行正在
npm run build
从控制台。 package.json 文件中的脚本如下所示:
"scripts": {
"build": "tsc -p src/",
...
下面@Seamus建议的修改后,出现同样的错误。
但是
如果我只是 运行 在控制台中
tsc -p src/
我得到的错误是不同的:
error TS7016: Could not find a declaration file for module 'mymodule'
这看起来像是找到了模块,如果我手动执行的话,但问题是,为什么它不能与 npm run build
一起使用?它在做一些不同的事情吗?
编译器选项 allowJs 将:
Allow JavaScript files to be compiled.
对于commonjs
,您需要这样的模块声明:
mymodule.d.ts
declare module "mymodule";
并且在您导入的来源中:
/// <reference path="mymodule.d.ts"/>
import * as myModule from 'mymodule';
好吧,我知道这已经过时了,但我遇到了这个问题,我想我找到了解决方法(可能部分是由于 Angular 更新)。
开始:
- 将您的 Angular 升级到最新版本 (
5.1
)。 - 将您的 TypeScript 升级到支持的最新版本(
4.*
,截至撰写本文时 -- 不是5.*
) - 您的配置文件中可能需要
allowJs: true
。
运行 ng serve --aot
或 ng build --watch=auto --aot
您应该看到上述错误并且无法访问您的站点。
打开您的应用程序中的一个 .ts 文件并进行小的更改(例如添加一个 space),然后保存文件。
您的应用应该可以编译!
(据我所知,--watch=auto
和 --aot
标志对于此解决方法至关重要)