我有一个用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都满意。
非常感谢
答案 0 :(得分:1)
TypeScript仅支持TypeScript模块的相对路径。 Ambient JavaScript模块应放在node_modules
文件夹中。来自Node.js doc:
如果传递给require()的模块标识符不是本机模块,并且不以'/','../'或'./'开头,则节点从当前模块的父目录开始,并添加/ node_modules,并尝试从该位置加载模块。
将.d.ts
放在.js
模块旁边,然后将其更改为:
declare module "mime" {
...
}
为:
declare module Mime {
...
}
export = Mime;
重写.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)
你需要:
添加库的定义文件(* .d.ts)
您必须明白,定义文件仅包含库的接口。您应该单独添加库源代码。
参考文献:
打字稿定义: 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。
中的声明