如何正确扩充Express类型?

时间:2019-04-16 16:37:14

标签: typescript express

我有一个文件:types/express.d.ts

declare namespace Express {
  export interface Response {
    respondWith(data: any): Response;
  }
}

,并且在app.js

Express.response.respondWith = function(data) {
  return this.json({
    errors: null,
    data: data
  });
};

如何将这两个文件正确地合并为一个“增强”?

I tried copying this almost identically。但这似乎不起作用。

Here's a codesandbox attempt at augmentation

1 个答案:

答案 0 :(得分:0)

我只是在自己学习TypeScript,所以此答案可能有待改进,但这是:

我认为您需要从express-serve-static-core而不是express进行扩充(至少我无法使其工作)。

另一件事是,除了从express导出回express-formater之外,我不知道其他任何扩充方法。根据TypeScript handbookexpress-formater是一个模块插件,因此我一直在寻找moment-range来在此处使用合适的模式,但没有成功。

相关代码:

express-formater.ts

import core from "express-serve-static-core";
import express from "express";

declare module "express-serve-static-core" {
  export interface Response {
    respondWith: (p1: any) => Response;
  }
}

express.response.respondWith = function(data: string) {
  return this.json({
    error: null,
    data: data
  });
};

export default express;

主要index.ts

import express from "./express-formater";

const app = express();
const port = 8080;

app.get("/", (req, res) => res.respondWith({ ok: true }) );

app.listen(port, () =>
  console.log(`Typescript app listening on port ${port}!`)
);

更新后的codesandboxtsconfig.json需要"esModuleInterop": true

更新

只需重新检查一下,就不必从express导出express-formater了。提醒我自己,一种改进的方法:

express-formater.ts

import core from "express-serve-static-core";
import express from "express";

declare module "express-serve-static-core" {
  export interface Response {
    respondWith: (p1: any) => Response;
  }
}

express.response.respondWith = function(data: string) {
  return this.json({
    error: null,
    data: data
  });
};

主要index.ts

import express from "express"
import "./express-formater";

const app = express();
const port = 8080;

app.get("/", (req, res) => res.respondWith({ ok: true }) );

app.listen(port, () =>
  console.log(`Typescript app listening on port ${port}!`)
);

更新了codesandbox

相关问题