【问题标题】:How to correctly setup an interface-only project (and its dependent projects) in NPM?如何在 NPM 中正确设置仅接口项目(及其依赖项目)?
【发布时间】:2018-06-13 20:37:10
【问题描述】:

我的 TypeScript 项目面临两个问题。

假设我想创建一个名为myproject-apiinterface-only TypeScript 项目。我打算在名为myproject-impl1myroject-impl2 的两个不同项目中实现接口。我正在使用Lerna 将这些项目作为模块在名为myproject 的根项目中进行管理,并且根据需要它们都是bootstrapped (npm link)。我也在使用gulp 转译TypeScript 源代码,目前配置非常简单。

问题 1. 即使在 package.json 中使用 "types": "dist/main.d.ts""types": "src/index.ts",实现模块也无法看到 myproject-api 中的类型定义。我还尝试将myproject-api/src/index.ts 移动到myproject-api/index.ts,但无济于事。编译器只是失败并显示消息 Cannot find module 'myproject-api'.

问题 2. 如果 .ts 源文件中没有实际实现,TypeScript 似乎不会生成 .d.ts 文件,除非我编译了tsc -d --outFile dist/main.js 的项目。换句话说,由于某种原因,如果我使用我的tsconfig.json 配置(例如tsc --project tsconfig.json),则会生成.js 文件,但不会生成.d.ts 文件。

P.S.:我开始这个项目只是为了充实和完善我的一些想法。如果有人对这种项目布局有更好的设置,请告诉我。


更多信息...

我在所有 .ts 项目中使用 ES6 导入。

这是我的文件夹布局:

.
├── lerna.json
├── package.json
├── packages
│   ├── myproject-api
│   |   ├── dist
│   │   ├── gulpfile.js
│   │   ├── package.json
│   │   ├── src
│   │   │   └── index.ts
│   │   └── tsconfig.json
│   └── myproject-impl*
│       ├── dist
│       ├── gulpfile.js
│       ├── package.json
│       ├── src
│       │   └── index.ts
│       └── tsconfig.json
└── README.md

packages/myproject-api/src/someClass.ts:

export interface ISomeClass { /* ... */ }

packages/myproject-api/src/index.ts:

export * from "./someClass.ts"
// (repeating this kind of export for all inner modules)

packages/myproject-impl*/src/index.ts:

import { ISomeClass } from "myproject-api"
// ...

Gulp 配置:

var gulp = require("gulp");
var ts = require("gulp-typescript");
var tsProject = ts.createProject("tsconfig.json");

gulp.task("default", ["build"]);

gulp.task("build", function () {
    return tsProject.src()
        .pipe(tsProject())
        .js.pipe(gulp.dest("."));
});

这是所有项目的tsconfig.json

{
    "compilerOptions": {
        "target": "es6",
        "module": "amd",
        "strict": true,
        "baseUrl": ".",
        "outFile": "dist/main.js",
        "declaration": true,
        "lib": [
            "es5",
            "es2015.promise",
            "es2015.iterable"
        ]
    },
    "exclude": [
        "node_modules",
        "dist"
    ]
}

系统信息:

[flisboac@sonic ~]$ tsc --version
Version 2.6.2
[flisboac@sonic ~]$ node --version
v9.3.0
[flisboac@sonic ~]$ lerna --version
2.5.1
[flisboac@sonic ~]$ gulp --version
[03:39:24] CLI version 2.0.0
[flisboac@sonic ~]$ npm --version
5.6.0
[flisboac@sonic ~]$ uname -a
Linux sonic 4.14.6-1-ARCH #1 SMP PREEMPT Thu Dec 14 21:26:16 UTC 2017 x86_64 GNU/Linux
[flisboac@sonic ~]$ lsb_release -a
LSB Version:    1.4
Distributor ID: Arch
Description:    Arch Linux
Release:    rolling
Codename:   n/a

【问题讨论】:

  • 如果意图是 myproject-api 只是一个纯接口,为什么要尝试转换它而不是按原样发布 ts 文件作为 npm pkg,并且每个 impl 直接导入它?由于它的接口没有任何实现,消费者无需担心node_modules下的ts源的配置构建。
  • 问题是导入由于某种原因无法正常工作。
  • 它可能与消费者端配置/或其他东西有关 - 根据typescriptlang.org/docs/handbook/module-resolution.html,它是支持的解决方案。试试tsc --traceResolution 可能会给出答案。
  • @OJKwon 事实上,--traceResolution 帮助我弄清楚了。如果您在tsconfig.json 中指定"moduleResolution": "node"tsc 仅查看package.json,默认情况下为"moduleResolution": "classic"。尽管出于某种原因,Visual Studio Code 仍然无法确定导入,但至少我可以通过 tsc 编译项目。无论如何,你想回答吗?
  • 作为第二个说明,我必须重新启动 VSCode 才能正确解析导入。

标签: node.js typescript npm import typescript-typings


【解决方案1】:

正如@OJKwon 建议的那样,--traceResolution 帮助我弄清楚了。根据the documentation for module resolution,如果您在tsconfig.json 中指定"moduleResolution": "node",则tsc 仅查看package.json,默认情况下为"moduleResolution": "classic"。使用index.ts 作为默认导入模式也仅用于node 分辨率。

我还必须重新启动 VSCode 才能正确解析导入。

【讨论】:

    猜你喜欢
    • 2019-07-10
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    相关资源
    最近更新 更多