typescript构建koa工程ctx.render和ctx.session报错

幽辰
  • 22

package.json

image.png

tsconfig.json

image.png

app.ts

import * as Koa from 'koa'
import * as Router from 'koa-router'
import * as path from 'path'
import * as koaStatic from 'koa-static'
import * as session from 'koa-session'
const render = require('koa-art-template');

const app = new Koa();
const router = new Router();

// 配置art-template
render(app, {
    root: path.join(__dirname, 'views'),
    extname: '.html',
    debug: process.env.NODE_ENV !== 'production'
});
app.use(koaStatic(__dirname + '/static'));

// 配置session中间件
app.keys = ['some secret hurr']; // cookie的签名

const CONFIG = {
    key: 'koa:sess', // cookie的key
    maxAge: 86400000, // 过期时间
    autoCommit: true, // 是否自动提交到响应头
    overwrite: true, // 是否允许重写
    httpOnly: true,
    signed: true, // 是否签名
    rolling: false, // 是否每次响应时刷新Session的有效期
    renew: false, // 是否在Session快过期时刷新Session的有效期
};

app.use(session(CONFIG, app));

router.get('/', async (ctx: any) => {
    console.log(ctx.session.userinfo)
    await ctx.render('index')
})

router.get('/login', async (ctx: any) => {
    ctx.session.userinfo = '张三';
    ctx.body = '登录成功'
})

router.get('/news', async (ctx: any) => {
    console.log(ctx.session.userinfo)
    ctx.body = '这是一个新闻'
})

// 启动路由
app.use(router.routes());
app.use(router.allowedMethods());

app.listen(3000)

如果像我上面的代码这么写是没有问题的,art-template也可以渲染,session也可以访问,但是在router.get方法里的ctx没有代码提示比如会出现下图的情况
image.png
我知道是因为ctx的类型为any导致的,但是,如果我把any去掉,使用ts的类型检查,会出现下列情况
image.png
本人小白,请求大佬解救,我还是想使用ts的类型检查来写代码,我猜测是不是koa-router已经不推荐使用ctx.render和ctx.session这两种方法了

回复
阅读 1.4k
1 个回答
✓ 已被采纳

koa-router 和 koa-session 是两个插件,他们的类型没有组合起来

试试添加 typings/index.d.ts 文件

import session from "koa-session";

declare module "koa-router" {
    export interface IRouterParamContext<StateT = any, CustomT = {}> {
        session: session.Session | null;
        readonly sessionOptions: session.opts | undefined;

    }
}

如果没效果,关了 VS 重新打开一下试试。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏