我正在嘗試啓動並運行個人第一個TypeScript和DefinitelyTyped Node.js應用程序,而且遇到一些錯誤。 html
嘗試轉換簡單的TypeScript Node.js頁面時,出現錯誤「 TS2304:找不到名稱'require'」。 我已經閱讀了Stack Overflow上此錯誤的其餘幾種狀況,但我認爲我沒有相似的問題。 我在shell提示符下運行命令: node
tsc movie.server.model.ts.
該文件的內容是: webpack
'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')
行上引起。 git
Types / tsd.d.ts文件的內容是: github
/// <reference path="node/node.d.ts" /> /// <reference path="requirejs/require.d.ts" />
.d.ts文件引用放置在適當的文件夾中,並經過如下命令添加到Types / tsd.d.ts中: web
tsd install node --save tsd install require --save
產生的.js文件彷佛工做正常,所以我能夠忽略該錯誤。 可是,我很高興知道爲何會發生此錯誤以及我在作什麼錯。 typescript
您能夠 shell
declare var require: any
或者,要得到更全面的支持,請使用DefinitelyTyped的require.d.ts npm
另外,您能夠嘗試如下方法,而不是var mongoose = require('mongoose')
json
import mongoose from 'mongoose' // or import mongoose = require('mongoose')
代替:
'use strict'; /// <reference path="typings/tsd.d.ts" />
嘗試:
/// <reference path="typings/tsd.d.ts" /> 'use strict';
即先參考路徑。
我發現解決方案是使用TSD命令:
tsd install node --save
它將添加/更新typings/tsd.d.ts
文件,而且該文件包含節點應用程序所需的全部類型定義。
在文件的頂部,我像這樣對tsd.d.ts
了引用:
/// <reference path="../typings/tsd.d.ts" />
從2016年1月起,需求定義以下:
declare var require: NodeRequire; interface NodeModule { exports: any; require: NodeRequireFunction; id: string; filename: string; loaded: boolean; parent: any; children: any[]; }
我接受了彼得·瓦爾加(Peter Varga)的回答 ,添加了declare var require: any;
並經過使用preprocess-loader將其製做爲適用於全部.ts文件的通用解決方案:
安裝預處理程序加載器:
npm install preprocessor-loader
將加載程序添加到您的webpack.config.js中 (我正在使用ts-loader處理TypeScript源代碼):
module: { loaders: [{ test: /\.tsx?$/, loader: 'ts-loader!preprocessor?file&config=preprocess-ts.json' }] }
{ "line": false, "file": true, "callbacks": [{ "fileName": "all", "scope": "source", "callback": "(function shimRequire(source, fileName) { return 'declare var require: any;' + source; })" }] }
您能夠用相同的方法添加更強大的require.d.ts ,但declare var require: any;
在個人狀況下就足夠了。
請注意, 預處理器1.0.5中存在一個錯誤 ,該錯誤會截斷最後一行,所以請確保在末尾有額外的行空間返回,而且您會很好。
若是您只有一個文件使用require,或者出於演示目的而執行此操做,則能夠在TypeScript文件的頂部定義require。
declare var require: any
若是您使用的是TypeScript 2.x,則再也不須要安裝Typings或Definitely Typed。 只需安裝如下軟件包。
npm install @types/node --save-dev
諸如Typings和tsd之類的工具將繼續起做用,咱們將與這些社區一塊兒工做,以確保順利過渡。
驗證或編輯您的src /tsconfig.app.json,使其包含如下內容:
... "types": [ "node" ], "typeRoots": [ "../node_modules/@types" ] ...
確保該文件位於src文件夾中,而沒有一個位於根應用程序文件夾中。
默認狀況下, 除非您指定了這些選項中的任何一個, 不然 @types下的任何軟件包都已包含在您的版本中。 閱讀更多
使用類型(DefinitelyTyped的替代),您能夠直接從GitHub存儲庫中指定定義。
安裝打字
npm install typings -g --save-dev
從DefinitelyType的倉庫中安裝requireJS類型定義
typings install dt~node --save --global
若是將Webpack用做構建工具,則能夠包括Webpack類型。
npm install --save-dev @ types / webpack-env
更新您的tsconfig.json
用在如下compilerOptions
:
"types": [ "webpack-env" ]
這使您能夠執行require.ensure
和其餘Webpack特定功能。
使用CLI,您能夠按照上面的Webpack步驟進行操做,並將「類型」塊添加到tsconfig.app.json
。
或者,您可使用預安裝的node
類型。 請記住,這將包括客戶端代碼中實際上不可用的其餘類型。
"compilerOptions": { // other options "types": [ "node" ] }