在我们使用Koa或者Express进行开发时会经常使用中间件进行访问权限过滤或者属性加工,很多时候我们需要把中间件的属性传递给下一个路由函数,但是因为TS类型的限制我们无法直接获取扩展的元素或者无法获取正确的类型。本文讲解了在使用Koa/Express TypeScript开发时如何扩展中间件上的属性。
tsconfig.json
在typeRoots中设置自定义类型的文件夹,我们将自定义的类型放在文件夹中
代码语言:javascript复制{
"compilerOptions": {
"typeRoots": ["types"]
},
"include": ["src"],
"exclude": ["node_modules", "**/*.d.ts"]
}
设置:
Koa:
这里只是举个例子,这样设置的话ctx上就可以直接获取到id和status属性
代码语言:javascript复制import type { Context } from "koa";
declare module "koa" {
interface Context {
/** 用户ID*/
id?: number;
/** 用户身份*/
<span style="font-size: 16px; white-space: pre-wrap;">auth</span><span style="white-space: pre-wrap;">?: number;</span><br/> }
}
类似这样,设置后后面的路由参数就可以直接拿到id了:
代码语言:javascript复制import type { Context, Next } from "koa";
function auth(status: number[]) {
return (ctx: Context, next: Next) => {
ctx.id = 1;
next();
};
}
export default auth;
Express:
代码语言:javascript复制import type {Express} from 'express'declare namespace Express {
interface Request {
authentication?: "admin" | "user";
admin?: string; //管理员id
userId?: string; //用户/管理员的id
isAdmin?: boolean; //判断是否管理员
}
}
基本和Koa的一样,这是我在之前写的Demo中直接复制的如果不行仿照Koa的修改一下即可。