在 TypeScript 中,如何使用 (a: type, b:type): any 实现接口?

Posted

技术标签:

【中文标题】在 TypeScript 中,如何使用 (a: type, b:type): any 实现接口?【英文标题】:In TypeScript, how do I implement an interface with (a: type, b:type): any? 【发布时间】:2016-08-16 09:27:14 【问题描述】:

具体来说,我正在尝试为 express 设置服务器端打字稿编译。

公开的接口之一是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'

有什么建议吗?我不确定我做错了什么。

【问题讨论】:

【参考方案1】:

RequestHandler 是一个接口,它使用调用签名指定某些类无法实现的内容。你想要一个常规函数:

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

如果接口在方法签名前面有new,它将定义您的类的构造函数的形状,但事实并非如此。

另一种思考方式是:当你使用一个类时,你定义了一个必须用new 调用的函数。 Express 是调用“new PageNotFound(...)”还是调用“pageNotFound(...)”?

正如 TypeScript 开发人员之一 Ryan Cavanaugh 所说的here:

更正式地说,实现接口的类是类实例所具有的合同... – Ryan Cavanaugh 2012 年 11 月 15 日 23:57

【讨论】:

没错。由于 tslint 抱怨,我还添加了类型定义 : void"use strict";。谢谢,艾伦!【参考方案2】:

您希望保持简单,类用于多次使用的对象。模块express 为您提供具有正确属性的路由器对象。

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; 

【讨论】:

以上是关于在 TypeScript 中,如何使用 (a: type, b:type): any 实现接口?的主要内容,如果未能解决你的问题,请参考以下文章

Typescript:在这种情况下如何使用泛型类型键入函数?

如何在带有 React 的 Typescript/JSX 中使用带有箭头函数的泛型?

如何区分 TypeScript 重载中的类型对象和数组?

如何在 TypeScript 的类中使用元组

如何在带有接口的 Typescript 中声明公共和私有变量?

TypeScript的core.ts如何在没有重载错误的情况下构建?