停止我仅从中导入类型的Typescript编译文件

时间:2019-08-04 10:45:06

标签: typescript

我遇到了一个意外的问题,即使用Typescript编译一些测试代码。

我的测试从我的应用代码中导入类型,仅此而已。只是类型,没有实际逻辑。但是,当我使用tsc编译测试时,我在输出目录中发现了我从中导入类型的应用程序代码文件以及它们导入的所有文件都已经存在并且已经被编译。

这很烦人,因为它弄乱了输出目录的结构。测试的入口点位于./tests/src/index.js,我希望编译后的输出位于./output/index.js-而不是因为导入的应用程序代码弄乱了结构,因此将其输出到更深的另一个目录-{ {1}}。

这里用一个简化的例子来说明问题

全部位于同一目录中的源文件

./output/tests/src/index.js

我运行此命令,并以-- a.ts -- import { SomeType } from './b' // I ONLY import a type from b.js, no actual code import { someFunction } from './c' const someValue: SomeType = { hello: 'world' } someFunction(someValue.hello) -- b.ts -- export type SomeType = { hello: string } export const someUnusedFunction = () => { console.log('this is never used') } -- c.ts -- export const someFunction = (x: string) => { console.log(x) } -- d.ts -- export const neverImported = () => { console.log('this file is never imported') } 作为入口点进行编译

a.ts

我期望tsc -module commonjs --moduleResolution node --outDir ./output ./a.ts a.js被编译为c.js,因为它们是其中包含任何JavaScript代码的唯一文件,这些文件由{{ 1}}。我希望./output不会出现,因为我只是从其中导入了一个类型,没有代码,而a.js因为它没有被任何东西导入而不会出现。

相反,我发现出现b.js d.jsa.js。看来Typescript不必要地编译了b.js,只是因为我从中导入了一个类型。请注意,它不会像预期的那样编译并输出c.js

我不明白为什么会这样做,似乎很明显b.js中没有任何代码被依赖树中的任何东西导入,就像d.js一样。我看不到您想要这种行为的用例,尽管也许有一个我没有想到的用例。

是否有办法在Typescript中将其关闭,并且只能编译从中导入实际代码的文件?


顺便说一下,这是上面的编译输出。您可以看到这里没有错误-b.js实际上并不是偶然导入或引用的,您可以清楚地看到d.jsb.jsa.js

require

1 个答案:

答案 0 :(得分:0)

在打字稿中没有选项。打字稿存储库中已有issue,但是由于有一些构建工具可以根据需要更改发射策略,因此已被废弃。