在 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 中使用带有箭头函数的泛型?