如何在Node.js中使用typescript声明文件来要求外部js库

时间:2015-08-11 16:00:08

标签: javascript node.js typescript

我有一个用Typescript编写的Node.js项目,我试图让它与mime.js(https://github.com/broofa/node-mime)一起工作。我有一个声明文件(https://github.com/borisyankov/DefinitelyTyped/blob/master/mime/mime.d.ts),但无法在typescript中使用node.js来很好地使用它。

我有以下内容:

/// <reference path="../../libs/mime.d.ts" />

import mime = require( 'mime' );

这使得类型脚本编译器保持高兴,并且在我尝试在Node中运行它之前一切都很好。

当我尝试运行它时,我得到了

Cannot find module 'mime'

但是,如果我将生成的javascript编辑为以下内容:

import mime = require( '../../libs/mime' );

一切正常。如果我将typescript文件更改为具有相对路径的require,则会出现编译器错误:

Cannot find external module '../../libs/mime'

如何将Typescript引用到mime.d.ts文件和mime.js文件中,以便编译器和Node都满意。

非常感谢

4 个答案:

答案 0 :(得分:1)

TypeScript仅支持TypeScript模块的相对路径。 Ambient JavaScript模块应放在node_modules文件夹中。来自Node.js doc

  

如果传递给require()的模块标识符不是本机模块,并且不以'/','../'或'./'开头,则节点从当前模块的父目录开始,并添加/ node_modules,并尝试从该位置加载模块。

解决方法1

.d.ts放在.js模块旁边,然后将其更改为:

declare module "mime" {
   ...
}

为:

declare module Mime {
   ...
}
export = Mime;

解决方法2

重写.d.ts文件:

declare module "mime" {
    export function lookup(path: string): string;
    ...
}

为:

declare interface IMime {
    function lookup(path: string): string;
    ...
}

然后使用普通var代替import

var mime = <IMime>require( '../../libs/mime' );

答案 1 :(得分:0)

尝试以下操作:在项目的根目录'npm install mime'。它将在其中创建带有mime的node_modules目录。您可以通过'require('mime')'导入它。您还必须“引用”.d.ts文件,但这是次要的事情,npm包节点将能够导入实际的javascript库。

我还建议使用TSD('npm install tsd -g')从DefinitelyTyped获取.d.ts文件。

Btw sry for typos,我是用手机写的。

答案 2 :(得分:0)

你需要:

  1. 添加库的定义文件(* .d.ts)

  2. 您必须明白,定义文件仅包含库的接口。您应该单独添加库源代码。

  3. 参考文献:

    打字稿定义: https://github.com/borisyankov/DefinitelyTyped

    mime的定义: https://github.com/borisyankov/DefinitelyTyped/blob/master/mime/mime.d.ts

答案 3 :(得分:0)

我找到了一种更好的方法,可以使用node_modules文件夹和typings文件夹。这里可以看到一个工作实例:

https://github.com/Roaders/contact-list-checker/tree/external-js-module-example

在这个应用程序中,我导入了ContactList类中的csv js库:

import csv = require('csv');

这是在安装之后:

npm install csv

由于csv lib位于node_modules文件夹中,我们不需要指定lib和lib的路径,只需csv就足以让编译器找到它。如果没有d.ts声明文件,我们会收到错误。这个声明文件可以位于typings文件夹中,直接来自tsd,但在tsd上找不到这个lib,所以我必须创建自己的。 csv.d.ts位于libs / csv:

declare module "csv" {}

(我稍后会添加函数接口)

模块名称HAS以匹配导入名称。文件名可以是任何东西。 您可以在执行导入的文件中添加对此文件的引用:

///<reference path="../../../libs/csv/csv.d.ts" />

或者正如我所做的那样,你可以在项目根目录的tsconfig.json中添加对它的引用:

{
    "compilerOptions": {
        "target": "es5",
        "module": "commonjs",
        "diagnostics": true
    },
    "files": [
        "./app.ts",
        "./typings/tsd.d.ts",
        "./libs/libs.d.ts"
    ]
}

(其中libs.d.ts引用了csv.d.ts)

此方法允许您使用npm install安装js libs并使用tsd。

中的声明