TypeScript 将自定义类型复制到outDir的选项

li9yvcax  于 4个月前  发布在  TypeScript
关注(0)|答案(4)|浏览(47)

搜索词

声明文件, .d.ts, 人体工程学, 可分发包, 库, 编译器选项

建议

我希望 tsc 能够包含一个选项,使得可以将我的项目源代码树中的 .d.ts 文件复制到配置的 outDir 中。

用例

我维护一个可分发的库,它经常作为其他包的依赖项使用。尽可能地,我依赖于 @type/* 包和核心类型库来表达我的库支持的平台中的类型。
然而,在这些情况下,这些源文件并不反映我支持的平台的真实情况(例如,具有专有 API 的老浏览器,或实验性的/不稳定的/新兴的网络平台功能)。在这些情况下,不适合将我的自定义类型上游到另一个包,即使是这样,等待上游贡献被接受和发布所涉及的延迟并不是阻止我的库发布的一个好理由。
在这些情况下,我倾向于在我的源代码树中用 .d.ts 文件表达这些类型。然而,根据 #5112 , tsc 作为原则不会将这些文件复制到我的配置的 outDir 中。这意味着我必须用额外的复制步骤使我的构建变得复杂,以生成一个全面、可发布的构件。与此同时,似乎 tsc 可以通过代表我复制这些文件来简化我的生活。

示例

这可以以许多方式表现出来,但一个假设的情况是添加一个编译器标志。将其称为 --include-custom-type-declarations (或任何合适的名称)。
如果 tsc 以设置为 true 的此标志调用,则 tsc 将包括源代码树中生成的所有 .d.ts 声明在内的构件。

检查清单

我的建议满足以下准则:

  • 这不会对现有的 TypeScript/JavaScript 代码造成破坏性更改
  • 这不会改变现有 JavaScript 代码的运行时行为
  • 这可以在不根据表达式的类型发出不同的 JS 的情况下实现
  • 这不是一个运行时特性(例如库功能、JavaScript 输出非 ECMAScript 语法等)
  • 这个特性将与 TypeScript's Design Goals 的其他部分一致。
vpfxa7rd

vpfxa7rd1#

这对于从JavaScript迁移到TypeScript的项目也非常有用。我想为遗留的JavaScript文件编写自定义类型声明文件,并从源代码树中输出.d.ts文件。然而,由于我的tsconfig.json具有{ declarations: true, allowJs: true }tsc,它会忽略源代码树中的.d.ts文件,并为其生成自己的、较少丰富的JavaScript模块声明。
例如,我有一个

src/
|- models/
   |- user.js
   |- user.d.ts (custom type declaration)

并且tsc发出

lib/
|- models/
   |- user.js
   |- user.d.ts (tsc's interpretation of user.js, ignoring custom declarations)

我知道我可以在遗留的JavaScript文件中编写JSDoc,但我更愿意编写TypeScript声明,并让tsc发出它们。

kxe2p93d

kxe2p93d2#

This has started to cause me minor grief because I have to compile unnecessarily. My project is setup as follows.

tsconfig.json (base config with common compiler settings)
src/
|- tsconfig.json (extends ../tsconfig.json, includes ./**/*, outDir: ../lib)
|- @types
   |- module-name
      |- index.d.ts (custom declarations for untyped module-name; tsc does not emit :/ )
|- **/*.ts (app ts files)
|- other-resources
   |- image files, openapi docs, etc. (tsc does not emit, ok)
|- scope-x
   |- legacy-x1.js (untyped legacy js module)
   |- legacy-x1.d.ts (inline declarations for untyped legacy js module; tsc does not emit :/ )
test/
|- tsconfig.json (extends ../tsconfig.json, includes ./**/*, outDir: ../test-lib, references ../src/tsconfig.json)
|- **/*.test.ts (imports compiled modules from ../lib, needs custom type declarations that tsc did not emit)

The tsconfig.json in the test directory uses a project reference to the src directory, which is great. Normally, to build test , my NPM script would simply tsc -b test . However, now that I have custom .d.ts type declarations in src that tsc does not emit, and TS files in test reference compiled modules in ../lib , I am forced to undermine the project reference functionality and explicitly npm run the entire build process for src , which includes manually copying type declarations and resources after tsc -b src , in order for modules in test to access necessary type information. So, I have a chicken and egg problem. tsc -b test will build both src and test , but the src build will not emit my custom declarations, and test imports from the src output directory lib , and the custom types are not present. I cannot copy the custom types to where they need to be before tsc -b test , because the src build will just overwrite them.
I need tsc to emit my custom type declarations that I have created alongside their legacy .js module counterparts.

kfgdxczn

kfgdxczn3#

请查看我的example repository以了解该问题的演示。

zengzsys

zengzsys4#

顺便说一下,包含自定义类型定义文件的目的不仅是为了同一项目中的编译测试,也是为了该包的下游消费者。

相关问题