116

如何node_modules从类中加载常规 NodeJS 模块(来自)TypeScript

当我尝试编译.ts包含以下内容的文件时:

var sampleModule = require('modulename');

编译器提示我不能在这个范围内使用 require。(该行位于文件的开头)。

4

5 回答 5

118

当找不到符号时,Typescript 总是会抱怨。编译器带有一组默认定义windowdocument这些定义在一个名为lib.d.ts. 如果我在这个文件中做一个 grep ,require我找不到函数的定义require。因此,我们必须自己告诉编译器这个函数将在运行时使用以下declare语法存在:

declare function require(name:string);
var sampleModule = require('modulename');

在我的系统上,这编译得很好。

于 2012-10-05T08:26:40.210 回答
79

正确的语法是:

import sampleModule = require('modulename');

或者

import * as sampleModule from 'modulename';

然后用--module commonjs.

如果包没有附带index.d.ts文件并且它package.json没有"typings"属性,tsc则会吠叫它不知道'modulename'指的是什么。为此,您需要在http://definitelytyped.org/.d.ts上为它找到一个文件,或者自己编写一个。

如果您正在为 Node.js 编写代码,您还需要node.d.ts来自http://definitelytyped.org/的文件。

于 2016-02-03T07:47:12.270 回答
53

最好的解决方案是获取 Node 类型定义的副本。这将解决各种依赖问题,不仅require(). 这以前是使用类似的包完成的typings,但正如 Mike Chamberlain 所提到的,不推荐使用 Typings。现代的方式是这样做的:

npm install --save-dev @types/node

它不仅会修复编译器错误,还会将 Node API 的定义添加到您的 IDE。

于 2017-10-18T21:20:06.917 回答
3

使用类型从 TypeScript 访问节点函数:

typings install env~node --global

如果你没有打字安装它:

npm install typings --global
于 2016-12-29T09:42:56.477 回答
0

加载打字稿模块时,我使用带有扩展名的模块名称,即“.ts”

const sampleModule = require('modulename.ts');

仅供参考,在我的情况下,“node”命令(v14.17.1)直接使用“.ts”文件而不生成“*.js”文件。

于 2021-06-28T05:17:34.597 回答