typescript 如何合并声明,非合并函数

比如koa-bodyparser中的声明了

declare module "koa" {
    interface Request {
        body: {} | null | undefined;
        rawBody: {} | null | undefined;
    }
}

我怎么才能给body增加可能的属性呢?比如

interface Imsg {
    msg: string
}

我还想用他本身已经写好的声明文件,只想加一个类型,
怎么样才能Imsg加到body的类型声明中,又如何判断接受到的数据是Imsg类型的数据呢?

阅读 3.8k
2 个回答

补充一个比重写.d.ts更方便快捷的方式吧。找一个方便的地方,复制粘贴

/**
 * Extend properties in `Original` with `Extend`
 * 
 * Typical use case: `{ a: number } => { a: number | boolean })`
 */
export type ForceExtend<Original, Extend = {}> =
    Pick<Original, Exclude<keyof Original, keyof Extend>>
    & Pick<Original | Extend, keyof Extend & keyof Original>

使用:

interface Request { body: {} | null | undefined; }
declare var a: ForceExtend<Request, { body: string }>
a.body // string | {} | null | undefined

无公害,不会覆盖原始的Request,其他文件不受影响。而且,上游更新下游也会自动更新,虽然不是正经的继承,但相当近似了。

自己新建一个d.ts文件重写一下它的的类型

interface Imsg {
    msg: string
}

declare module "koa" {
    interface Request {
        body: {} | null | undefined | Imsg;
        rawBody: {} | null | undefined;
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题