【问题标题】:NodeJs in Typescript打字稿中的 NodeJ
【发布时间】:2016-09-22 00:03:40
【问题描述】:

我想在编写 app.ts 文件时使用这种方式。 .d.ts 导入存在一些问题,我没有得到 express 的完整 api 公开。问题是我在 Webstorm2016 中没有获得完全的自动完成功能(还没有尝试过 vscode - 目前与我无关)。

///<reference path="../../typings/main.d.ts"/>
import * as express from 'express';
import * as logger  from 'morgan';
import * as bodyParser from 'body-parser';
import {join} from 'path';

/* local imports*/
import * as env from '../../tools/tasks';


class Startup {
    private _app: express.Express;
    private _port: number;

    constructor() {
        this._app  = express();
        this._port = env.settings.PORT;

        this.initialize();
        this.setupViews();
        this.listener();
    }

    private initialize() : void {
        // this._app.[use] => not recognized
        this._app.use(logger('dev')); 
        this._app.use(express.static(join(__dirname, 'public')));
        this._app.use(bodyParser.json());
        this._app.use('/', this.router());
    }

    private setupViews() : void {
        // this._app.[engine] => not recognized
        // this._app.[set]    => not recognized
        this._app.engine('.html', require('ejs').__express);
        this._app.set("views", join(__dirname, "views"));
        this._app.set("view engine", "html");
    }

    private router(): express.Router {
        /* routes */
        let index: express.Router = this._app.get('/', (request: express.Request, response: express.Response) => {
            response.render('index', { title: 'This is express initial' });
        });
        return index;
    }

    private listener() : void {
        let server: any =  this._app.listen(this._port, () => {
            var listeningPort: number = server.address().port;
            console.log('The server is listening on port: ' + listeningPort);
        });
    }
}

declare var app = new Startup();

这是我的编译错误列表:

src/server/app.ts(5,20): error TS2307: Cannot find module 'path'.
src/server/app.ts(8,22): error TS2307: Cannot find module '../../tools/tasks'.
src/server/app.ts(25,13): error TS2339: Property 'use' does not exist on type 'Express'.
src/server/app.ts(26,13): error TS2339: Property 'use' does not exist on type 'Express'.
src/server/app.ts(26,37): error TS2304: Cannot find name '__dirname'.
src/server/app.ts(27,13): error TS2339: Property 'use' does not exist on type 'Express'.
src/server/app.ts(28,13): error TS2339: Property 'use' does not exist on type 'Express'.
src/server/app.ts(32,13): error TS2339: Property 'engine' does not exist on type 'Express'.
src/server/app.ts(32,29): error TS2304: Cannot find name 'require'.
src/server/app.ts(33,13): error TS2339: Property 'set' does not exist on type 'Express'.
src/server/app.ts(33,31): error TS2304: Cannot find name '__dirname'.
src/server/app.ts(34,13): error TS2339: Property 'set' does not exist on type 'Express'.
src/server/app.ts(39,41): error TS2339: Property 'get' does not exist on type 'Express'.
src/server/app.ts(40,13): error TS2339: Property 'render' does not exist on type 'Response'.
src/server/app.ts(46,32): error TS2339: Property 'listen' does not exist on type 'Express'.
src/server/app.ts(54,17): error TS1039: Initializers are not allowed in ambient contexts.

typings.json:

        {
          "ambientDependencies": {
             "body-parser": "registry:dt/body-    parser#0.0.0+20160317120654",
 "express":"github:DefinitelyTyped/DefinitelyTyped/express/express.d.ts#7de6c3dd94feaeb21f20054b9f30d5dabc5efabd",
            "morgan": "registry:dt/morgan#1.2.2+20160317120654",
            "node": "registry:dt/node#4.0.0+20160319033040",
            "systemjs": "registry:dt/systemjs#0.18.4+20160316155526"
      }
    }

实际上已经找到了该问题的答案。出于某种原因typings 剥离了以下两个定义:

 - express-serve-static-core/express-serve-static-core.d.ts"
 - serve-static.d.ts

如果您同时安装它们,它就会开始显示自动完成功能。

【问题讨论】:

    标签: node.js express typescript webstorm


    【解决方案1】:

    我没有看到您粘贴的代码中的包的类型。

    解决此问题最可靠的方法是使用TypeScript Definition Manager 安装您需要的类型。

    您还必须提供类型引用。如果您要使用 TypeScript 定义管理器,它将如下所示:

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

    【讨论】:

    • 我正在使用打字,我确实有一个///&lt;reference path="../../typings/main.d.ts"/&gt;,但仍然没有结果。
    • 我从错误日志中看到您粘贴的文件中没有引用。
    • 对不起,我已经完成了,我将重新提交错误日志。
    • 好的。有“找不到模块'路径'”这意味着没有安装 node.d.ts。您能否提供 typings.json 以获取更多详细信息?
    • 我已经添加了文件。
    【解决方案2】:

    尝试为 express、serve-static、express-serve-static-core、mime 安装类型定义。

    typings install dt~node --global --save
    typings install dt~express dt~serve-static dt~express-serve-static-core dt~mime --global --save
    

    论文将有助于自动完成。

    【讨论】:

    • Typings 现已弃用。使用npm i --save @types/expressyarn add @types/express
    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 2012-09-23
    • 2021-07-02
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 2021-11-25
    • 2021-07-27
    相关资源
    最近更新 更多