【问题标题】:How to NodeJS require inside TypeScript file?如何在 TypeScript 文件中要求 NodeJS?
【发布时间】:2012-09-26 08:43:46
【问题描述】:

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

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

var sampleModule = require('modulename');

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

【问题讨论】:

  • 您能告诉我们您的代码(原始代码和编译代码)吗?我认为require可以在任何地方使用,它不依赖于范围。
  • 是的,但必须声明,并且不像 Valentin 建议的那样在默认 lib.d.ts 中声明。

标签: node.js typescript


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢。这适用于所有未声明的函数。我发现更好的解决方案是从打字稿样本中获取 node.d.ts 并引用它。比你拥有一切。还有express.d.ts。
  • 我觉得你也可以import sampleModule = module('modulename')
  • 是的,但 node.d.ts 目前位于v0.8.8。最好使用@Valentin 的方法,然后使用 WebStorm IDE,它可以下载您正在运行的 Node 版本的定义,并为您提供自动完成等功能。
  • @Radek 你是怎么做到的?我使用 WebStorm 7.0.2(最新)顺便说一句我没有找到脚本 node.d.ts,它在哪里?谢谢。
  • @Vadorequest 这应该会有所帮助:jetbrains.com/webstorm/webhelp/…
【解决方案2】:

正确的语法是:

import sampleModule = require('modulename');

import * as sampleModule from 'modulename';

然后使用 --module commonjs 编译您的 TypeScript。

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

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

【讨论】:

  • 我遵循了这种方法,使用“import * as $s from 'scriptjs';”因为我使用的是 TypeScript。 CKEDITOR.replace() 命令似乎执行了,我从中得到了看起来像有效的 DOM 元素,但是浏览器(仍然是文本区域)和我的 editor.on('contentDom', ...) 回调没有任何变化(也安装在 $s 回调中)永远不会被调用。知道发生了什么吗?
【解决方案3】:

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

typings install env~node --global

如果你没有打字?安装它:

npm install typings --global

【讨论】:

  • 应该注意,不推荐使用类型,而只支持npm install @types/node --save-dev
【解决方案4】:

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

npm install --save-dev @types/node

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

【讨论】:

  • 这对我也有用!但我不明白的是,我已经在全球范围内安装了它(即:npm install -g @types/node)但没有用?
  • 如果类型模块在 npm 中不可用怎么办?
  • @SudharshanNair,DefinitelyTyped 项目定义了很多类型。其他选项包括在您自己的项目中使用肯定类型的声明类型,或不使用类型定义,
【解决方案5】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 2018-04-23
    • 2019-06-16
    • 2012-09-27
    相关资源
    最近更新 更多