likes
comments
collection
share

Koa/Express+TypeScript扩展类型

作者站长头像
站长
· 阅读数 740

在我们使用Koa或者Express进行开发时会经常使用中间件进行访问权限过滤或者属性加工,很多时候我们需要把中间件的属性传递给下一个路由函数,但是因为TS类型的限制我们无法直接获取扩展的元素或者无法获取正确的类型。本文讲解了在使用Koa/Express+TypeScript开发时如何扩展中间件上的属性。

tsconfig.json

在typeRoots中设置自定义类型的文件夹,我们将自定义的类型放在文件夹中

{
  "compilerOptions": {
    "typeRoots": ["types"]
  },
  "include": ["src"],
  "exclude": ["node_modules", "**/*.d.ts"]
}

设置:

 Koa:

这里只是举个例子,这样设置的话ctx上就可以直接获取到id和status属性

import type { Context } from "koa";//一定要引入类型,不然会报错
declare module "koa" {
  interface Context {
    /** 用户ID*/
    id?: number;
    /** 用户身份*/
    auth?: number;
}

类似这样,设置后后面的路由参数就可以直接拿到id了:

import type { Context, Next } from "koa";
function auth(status: number[]) {
  return (ctx: Context, next: Next) => {
    ctx.id = 1;
    next();
  };
}
export default auth;

Express:

import type {Express} from 'express'declare namespace Express {
  interface Request {
    authentication?: "admin" | "user";
    admin?: string; //管理员id
    userId?: string; //用户/管理员的id
    isAdmin?: boolean; //判断是否管理员
  }
}

基本和Koa的一样,这是我在之前写的Demo中直接复制的如果不行仿照Koa的修改一下即可。

Koa/Express+TypeScript扩展类型