Typescript 从节点模块导入 ts 文件

Posted

技术标签:

【中文标题】Typescript 从节点模块导入 ts 文件【英文标题】:Typescript import ts file from node module 【发布时间】:2015-08-12 02:04:55 【问题描述】:

也许它是重复的,但我已经搜索了一个小时并没有找到答案。

我有一个名为 a-module 的节点模块,其中包含一些 .ts 文件(例如 a.ts

我有另一个节点模块b-module,它的依赖项中有a-module

我想将一些 .ts 文件从 a-module 导入到 b-module。 在b-module 的某个文件中,我写道:

import a = require('a-module/a');
console.log(a);

当我尝试用 tsc 编译 b-module 时,是这样说的

Cannot find external module 'a-module/a'.

我做错了什么?

附:我有用于 SublimeText 的 ArcticTypescript 插件,似乎找到a-module/a 足够聪明。那么为什么 tsc 无法找到我的文件呢?

P.P.S 我的文件结构是这样的

b-module/
  node_modules/
    a-module/
      a.ts
  b.ts

我正在尝试将a.ts 导入到b.ts

【问题讨论】:

你能发布你的目录结构吗?就像 basarat 所说,TypeScript 编译器需要知道模块的位置。 @vanhelgen 我已经用提供的文件结构更新了我的问题 【参考方案1】:

import a = require('a-module/a');

您需要使用相对路径,即../a-module/a,或者为 TypeScript 显式声明它,即declare module "a-module/a"

【讨论】:

如果我的a-module/a 是通过npm install 安装的另一个存储库中的文件a.ts,我应该在哪里声明? 在你的模块中的一些 .d.ts 文件中 如果我写 import a = require('./node_modules/a-module/a') 然后它编译。但它看起来很奇怪。为什么不像 CommonJS 允许的那样导入呢。 我猜这是因为 TypeScript 必须预先知道模块的类型,所以它坚持知道要加载的确切模块。 Node 在运行时解决依赖关系,所以它没有这个限制。

以上是关于Typescript 从节点模块导入 ts 文件的主要内容,如果未能解决你的问题,请参考以下文章

手动注册节点模块

Typescript es6导入模块“文件不是模块错误”

无法在不提供文件扩展名的情况下导入 TypeScript 模块

在没有 require() 的情况下使用 typescript 模块

如何让 TypeScript 对扩展从“节点模块”导入的类感到满意?

Typescript 1.8 模块:从文件夹中导入所有文件