需要带有 npm 和 typescript 的自定义模块

Posted

技术标签:

【中文标题】需要带有 npm 和 typescript 的自定义模块【英文标题】:Require custom module with npm and typescript 【发布时间】:2015-11-20 05:17:39 【问题描述】:

让我们玩两个项目:main-projectlib-project 它们都是用 typescript 编写的,然后使用 gulp 编译到普通的javascript。 我们的目标是在 main-project 中需要 lib-project

lib-project

|-- package.json
|-- gulpfile.js
|-- dist
   |-- index.js
   |-- a.js
| src
   |-- index.ts
   |-- a.ts

我们已经创建了那些从 ts 编译它们的 js;让我们快速看一下它们(我们有索引,因为我们最终会想要这么多出口)

index.ts

import a = require('./a');
module.exports = A: a.A;

a.ts

export class A 
  field: string;
  constructor(aField: string) this.field = aField;
  toString() : string return `A: $this.field`;

index.js

var a = require('./a');
module.exports =  A: a.A ;

a.js

var A = (function () 
    function A(aField) 
        this.field = aField;
    
    A.prototype.toString = function () 
        return "A: " + this.field;
    ;
    return A;
)();
exports.A = A;

这就是介绍;现在,我将它推送到 git repo 并要求它作为 package.json 中的 dependency 并运行 npm install,我们的 main-project 是:

主项目

|-- package.json
|-- gulpfile.js
|-- node_modules
    |--lib-project
       |-- dist
         |-- index.js
         |-- a.js
    |--node
       |...
 |--src
    |--app.ts

app.ts 中失败:cannot find module lib-project

app.ts

import a = require('lib-project');
var foo = new a.A('HELLO');
console.log(foo.toString());

我尝试了什么?

    将 lib-project 的 index.js 移至根文件夹 在package.json中,设置字段"main": "dist/index.js" import a = require('node_modules/lib-project/dist/index'); import a = require('../node_modules/lib-project/dist/index'); 多个版本的 tsc(打字稿编译器)

任何帮助表示赞赏:)


编辑

package.json


  "name": "lib-project",
  "version": "0.1.0",
  "description": "description here",
  "main": "dist/index.js",
  "scripts": ,
  "author": "",
  "license": "MIT",
  "dependencies": 
  

【问题讨论】:

你也可以在package.json 中粘贴lib-project 【参考方案1】:

您可能想参考:TypeScript: import external module from node_modules

要点: 使用tsc --module commonjs --declaration index.ts 编译,然后在导入时使用以下内容:

/// <reference path="node_modules/lib-project/index.d.ts" />
import a = require('lib-project');

【讨论】:

【参考方案2】:

我相信您缺少的是 lib 项目根目录中的 lib-project.d.ts 文件。这将填补您在 index.ts 中已有的角色,但您需要稍微调整一下以填补这个角色

|-- package.json
|-- gulpfile.js
|-- lib-project.d.ts <-- formerly index.ts
|-- dist
   |-- a.js
| src
   |-- a.ts

lib-project.d.ts 看起来像这样:

declare module 'lib-project' 
  import a = require('./a');
  export = A: a.A;

那么当你使用这个时,你可以使用:

import A from 'lib-project';

您可以参考我在此处所做的导出操作:https://github.com/Brocco/ng-bridge

还有导入:https://github.com/Brocco/ng-bridge-samples/blob/master/app/app.ts#L1

【讨论】:

以上是关于需要带有 npm 和 typescript 的自定义模块的主要内容,如果未能解决你的问题,请参考以下文章

带有 Typescript 错误 TS18003 的 Npm 服务器

使用带有 TypeScript 的 Bootstrap 和 jQueryUI - 获取 (TS) 重复属性“工具提示”

通过 npm 包共享 TypeScript 类型声明

TypeScript 安装

Visual Studio 2017中应用程序的自定义安装程序

node自定义安装更改npm全局模块默认安装路径