我试图让我的第一个TypeScript和DefinitelyTyped Node.js应用程序启动和运行,并运行到一些错误。

当我试图编译一个简单的TypeScript Node.js页面时,我得到错误“TS2304:找不到名称'require'”。我已经阅读了Stack Overflow上发生的其他几次此错误,我不认为我有类似的问题。 我在shell提示符下运行命令:

tsc movie.server.model.ts.

这个文件的内容是:

'use strict';

/// <reference path="typings/tsd.d.ts" />

/*    movie.server.model.ts - definition of movie schema */

var mongoose = require('mongoose'),
Schema = mongoose.Schema;

var foo = 'test';

在var mongoose=require('mongoose')行上抛出错误。

typings/tsd.d. d的内容。Ts文件是:

/// <reference path="node/node.d.ts" />
/// <reference path="requirejs/require.d.ts" />

.d。Ts文件引用被放置在适当的文件夹中,并添加到typings/tsd.d。通过命令:

tsd install node --save
tsd install require --save

生成的.js文件似乎工作正常,所以我可以忽略这个错误。但我想知道为什么这个错误发生,我做错了什么。


当前回答

如果你正在使用Yarn v3,看到这个错误(不能找到name require)或其他节点相关的“不能找到”错误在VSCode中,确保你已经安装了Yarn的VSCode sdk插件,并选择了Typescript的工作空间版本。

安装sdk:

yarn dlx @yarnpkg/sdks

设置Typescript版本:

选择一个Typescript文件 按Command + Shift + P 类型Typescript:选择“Typescript版本”

选择“使用工作区版本”

详情见https://yarnpkg.com/getting-started/editor-sdks#vscode。

其他回答

对于TypeScript 2。X,现在有两个步骤:

安装定义require的包。例如: 安装@types/node 告诉TypeScript在tsconfig.json中全局包含它: { " compilerOptions ": { “类型”(“节点”): } }

只有当您需要访问诸如require之类的全局可用函数时,第二步才重要。对于大多数包,你应该只使用import package from 'package'模式。没有必要在tsconfig中包含每个包。Json类型数组。

Electron + Angular 2/4加法:

除了将“node”类型添加到ts.config各种文件之外,最终对我有用的是将“node”类型添加到 typings.d.ts文件:

declare var window: Window;
interface Window {
  process: any;
  require: any;
}

注意,我的案例是用Electron + Angular 2/4开发的。我需要window全局的require。

你可以

declare var require: any

或者,要获得更全面的支持,请使用DefinitelyTyped的require.d.ts

同样,不要使用var mongoose = require('mongoose'),你可以试试下面的方法

import mongoose from 'mongoose' // or
import mongoose = require('mongoose')

在tsconfig.json中添加如下内容:

"typeRoots": [ "../node_modules/@types" ]

除了cgatian的答案,对于TypeScript 1.x

如果仍然看到错误,请在编译器选项中特别提供index.d.ts。

"files": [
    "typings/index.d.ts"
]