【发布时间】:2018-06-13 20:37:10
【问题描述】:
我的 TypeScript 项目面临两个问题。
假设我想创建一个名为myproject-api 的interface-only TypeScript 项目。我打算在名为myproject-impl1 和myroject-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