2

具体的には、エクスプレス用にサーバー側の typescript コンパイルをセットアップしようとしています。

公開されているインターフェイスの 1 つは、次の構造を持つ RequestHandler です。

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

declare module "express-serve-static-core" {
  ...

  interface RequestHandler {
    (req: Request, res: Response, next: NextFunction): any;
  }
}

私は次のクラスを書きました:

import * as express from "express";

class PageNotFound implements express.RequestHandler {

  constructor (req: express.Request, res: express.Response, next: express.NextFunction) {
    let viewFilePath: string = "404";
    let statusCode: number = 404;
    let result: Object = {
      status: statusCode,
    };

    res.status(statusCode);
    res.render(viewFilePath, {}, function (err: Error, html: string): void {
      if (err) {
        res.status(statusCode).json(result);
      }
      res.send(html);
    });
  }
}

ただし、これによりエラーがスローされます。

error TS2345: Argument of type 'typeof PageNotFound' is not assignable to parameter of type 'RequestHandler'. Type 'typeof PageNotFound' provides no match for the signature '(req: Request, res: Response, next: NextFunction): any'

何か提案はありますか?何が間違っているのかわかりません。

4

2 に答える 2

2

RequestHandler は、クラスが実装できない呼び出し署名で何かを指定しているインターフェースです。通常の機能が必要です:

function pageNotFound(req: express.Request, res: express.Response, next: express.NextFunction) {
    ...
}

インターフェイスがnewメソッド シグネチャの前にある場合、クラスのコンストラクターの形状を定義することになりますが、そうではありません。

これについて考える別の方法は次のとおりです。クラスを使用するときは、 で呼び出さなければならない関数を定義していますnew。Express は "new PageNotFound(...)" を呼び出しますか、それとも "pageNotFound(...)" を呼び出しますか?

TypeScript 開発者の 1 人である Ryan Cavanaugh は、次のように述べています

より正式には、インターフェイスを実装するクラスは、クラスのインスタンスが持つものの契約です... — ライアン・カバノー

于 2016-04-22T16:39:51.393 に答える
0

シンプルに保ちたいのですが、クラスは複数回使用されるオブジェクト用です。モジュールexpressは、正しいプロパティを持つ Router オブジェクトを提供します。

import * as express from 'express';
const router = express.Router();

router.get('/', (req: express.Request, res: express.Response, next: express.NextFunction) => {
    res.render('index', {
        title: 'Express'
    })
});

export = router; 
于 2016-09-04T02:48:48.490 に答える