打字稿模块分辨率

Posted

技术标签:

【中文标题】打字稿模块分辨率【英文标题】:typescript module resolution 【发布时间】:2016-04-18 09:35:25 【问题描述】:

是否有打字稿模块解析策略允许我在同一模块中同时拥有本地导入以斜杠开头和从 node_modules 导入?

将“moduleResolution”设置为“node”时,编译器找不到我的本地模块,使用所有其他选项时,它在我尝试导入的 node_modules 目录中看不到模块。

我的文件中有以下导入:

import Injectable from "angular2/core";
import Logger from "core/logging/Logger";

“angular2/core”位于node_modules,“core/logging/Logger”是我的本地模块。

我认为这应该是可能的,如果您查看 Angular 的代码,他们似乎两者都有,即。在 http.ts 模块中:https://github.com/angular/angular/blob/master/modules/angular2/src/http/http.ts

import Injectable from 'angular2/core'; //this is local
import Observable from 'rxjs/Observable'; //this probably comes from node_modules

更多背景信息: 我有一个由两个子项目组成的项目: - 图书馆 - 应用程序 库定义了一些应用程序然后使用的实用程序。我的构建过程首先构建 'library' 子项目,然后将它(与 d.ts 文件一起编译的 js)复制到 'app's node_modules 中的 'library' 子文件夹,然后编译 'app'。

在“图书馆”中,我有以下课程:

//file project/library/jsonparser/JSONParser.ts
class JSONParser ... 

//file project/library/services/ConfigurationService.ts
import JSONParser from "../jsonparser/JSONParser"
class ConfigurationService 
  constructor(parser: JSONParser) ... 

在“应用”中:

import JSONParser from "library/jsonparser/JSONParser" //this comes from node_modules in 'app'
import ConfigurationService from "library/services/ConfigurationService" //from node_modules
class AppConfigurationService extends ConfigurationService 
  constructor(parser: JSONParser) 
    super(parser);
  

只要 JSONParser 有任何非公共字段(它们是从两个不同的地方导入的,因此对于打字稿来说,它们是两种不同的类型),它就不会编译。这就是为什么我要尝试两个导入我的模块而不在开始时使用斜线。但也许还有其他解决方案?

【问题讨论】:

【参考方案1】:

我认为这应该是可能的,如果您查看 Angular 的代码,他们似乎两者都有,即。在 http.ts 模块中:https://github.com/angular/angular/blob/master/modules/angular2/src/http/http.ts

不是微不足道的。

他们有模块分辨率classichttps://github.com/angular/angular/blob/6b73d09ba1d8c227d1b297341de2218aea5d1276/modules/angular2/tsconfig.json#L12

从 'rxjs/Observable' 导入 Observable; //这可能来自node_modules

他们有一个非平凡的构建管道,将其映射到node_modules。见:https://github.com/angular/angular/blob/851647334040ec95d1ab2f376f6b6bb76ead0d9a/tools/broccoli/broccoli-typescript.ts#L271

【讨论】:

以上是关于打字稿模块分辨率的主要内容,如果未能解决你的问题,请参考以下文章

1920分辨率设计稿适配不同分辨率

打字稿:具有有效打字的“找不到模块”

无法使用 tsc 节点模块编译打字稿

打字稿,需要模块作为类

打字稿给出,“找不到模块'xmlhttprequest'的声明文件。”

打字稿扩展模块(增强)