【问题标题】:How to require an external js library in Node.js with a typescript declaration file如何使用打字稿声明文件在 Node.js 中使用外部 js 库
【发布时间】:2015-08-11 16:00:07
【问题描述】:

我有一个用 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' );

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

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

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

非常感谢

【问题讨论】:

  • 你使用的是什么版本的 TypeScript?
  • Typescript 1.4 版

标签: javascript node.js typescript


【解决方案1】:

TypeScript 仅支持 TypeScript 模块的相对路径。环境 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 非常感谢。我不想使用 npm 将它安装在一个神奇创建的文件夹中,因为其他所有开发人员都必须这样做(除非我签入 modules 文件夹但不喜欢这样的想法)。非常感谢
【解决方案2】:

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

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

顺便说一句,我是用手机写的。

【讨论】:

    【解决方案3】:

    你需要:

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

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

    参考资料:

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

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

    【讨论】:

      【解决方案4】:

      我找到了一种更好的方法,它适用于 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 库位于 node_modules 文件夹中,我们不需要指定库的路径和路径,只需 csv 就足以让编译器找到它。如果没有 d.ts 声明文件,我们会得到错误。这个声明文件可以位于typings文件夹中,直接来自tsd,但是在tsd上找不到这个lib,所以我必须创建自己的。 csv.d.ts 在 libs/csv:

      declare module "csv" {}
      

      (我稍后会为此添加功能接口)

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

      ///<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 库并使用来自 tsd 的声明。

      【讨论】:

        猜你喜欢
        • 2016-05-19
        • 2017-02-16
        • 2014-07-30
        • 1970-01-01
        • 2016-10-09
        • 1970-01-01
        • 2012-06-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多