什么放在package.json类型字段中的基于打字稿的库

Vik*_*alk 12 typescript visual-studio-code

关于如何最好地与代码导航并行开发多个打字稿模块并仍然以正确的方式发布,我有点困惑.那么我应该把它放在package.json"types"字段中呢?

根据:Typescriptlang.org/publishing.html

我应该index.d.ts像我这样生成一个引用:

{
    "name": "awesome",
    "author": "Vandelay Industries",
    "version": "1.0.0",
    "main": "./lib/main.js",
    "types": "./lib/main.d.ts"
}
Run Code Online (Sandbox Code Playgroud)

如果我然后并行开发一个依赖于此模块的模块,npm link例如vscode中的代码导航会让我跳转到这个定义文件中.这不是我想要的.

我想进入源文件,以便能够在dep中并行编辑.在这方面没有内联或无内联的tsconfig设置有帮助.我可能会在这里遗漏一些东西.我管理我的工作流程以正常工作的唯一方法是实际指向源main.ts文件:

{
    "name": "awesome",
    "author": "Vandelay Industries",
    "version": "1.0.0",
    "main": "./lib/main.js",
    "types": "./src/main.ts"
}
Run Code Online (Sandbox Code Playgroud)

然而,这会在发布时让事情破裂吗?

至少如果我把src放在.npmignore下面.我无法理解使用多个打字稿模块获得良好工作流程的最佳方法.

我的意思是,我不想将package.json作为发布过程的一部分进行修改......?

Sha*_*tin 19

TypeScript 项目参考

据我所知,TypeScript项目参考将满足您的要求:

  • VS Code 导航转到*.ts源文件而不是*.d.ts文件。
  • package.jsontypes值引用该*.d.ts文件。

这提供了开发人员工具,而无需更改您发布的方式/内容。

演示

在 GitHub 中创建了一个简单的演示项目。以下是如何使用代码导航设置项目引用的要点。

包01

tsconfig.json 允许另一个 TypeScript 项目引用它 ( composite) 并允许代码导航工作 ( declarationMap)。在 package.json 中,NPM 作用域 ( @shaunluttin) 不是完全必要的;我包括它以避免命名冲突。

配置文件

{
  "compilerOptions": {
    "target": "es5",
    "composite": true,
    "declarationMap": true
  }
}
Run Code Online (Sandbox Code Playgroud)

包.json

{
  "name": "@shaunluttin/package01",
  "version": "1.0.0",
  "main": "index.js",
  "types": "index.d.ts"
}
Run Code Online (Sandbox Code Playgroud)

包02

tsconfig.jsonreferences包 01。这就是设置工具的原因。package.json 以与通常相同的方式依赖于 package01。

配置文件

{
  "compilerOptions": {
    "target": "es5"
  },
  "references": [
    {
      "path": "../package01"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

包.json

{
  "name": "@shaunluttin/package02",
  "version": "1.0.0",
  "main": "index.js",
  "types": "index.d.ts",
  "dependencies": {
    "@shaunluttin/package01": "1.0.0"
  }
}
Run Code Online (Sandbox Code Playgroud)

NPM 链接

对于本地开发,这两个包通过npm link.

cd package01
npm link

cd ../package01
npm link @shaunluttin/package01
Run Code Online (Sandbox Code Playgroud)

最后的想法

该文档提到了一些过于复杂而无法在此答案中列出的警告。

  • 在“NPM Link”下放置“cd ../package01”的地方,您的意思是“cd ../package02”吗? (3认同)
  • 如果我有很多 ts 文件并创建很多 dist/types/*.d.ts 文件怎么办?我不想在 package.json 中创建数组。如果我这样写`./dist/types/*.d.ts`,则没有任何效果,并且另一个项目会收到错误`无法找到模块的声明文件...尝试 npm i --save-dev @types/ ride(如果存在)或添加包含声明模块“ride”的新声明(.d.ts)文件;` (3认同)

Ben*_*ley 7

这是一个更轻量级的替代方案,但它需要使用 PNPM。在您的 package02 中,将其添加到您的 package.json 中:

...
"type": "module",
"exports": {
  ".": "./src/index.ts"
},
"types": "./src/index.ts",
"publishConfig": {
  "exports": {
    ".": "./lib/index.js"
  },
  "types": "./lib/index.d.ts"
},
...
Run Code Online (Sandbox Code Playgroud)

当您的包发布时,这些publishConfig选项将覆盖 src 中的开发引用。请注意,我正在使用此解决方案构建 ESM 包。不确定CJS。