鍍金池/ 問(wèn)答/HTML/ typescript 如何合并聲明,非合并函數(shù)

typescript 如何合并聲明,非合并函數(shù)

比如koa-bodyparser中的聲明了

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

我怎么才能給body增加可能的屬性呢?比如

interface Imsg {
    msg: string
}

我還想用他本身已經(jīng)寫好的聲明文件,只想加一個(gè)類型,
怎么樣才能Imsg加到body的類型聲明中,又如何判斷接受到的數(shù)據(jù)是Imsg類型的數(shù)據(jù)呢?

回答
編輯回答
扯不斷

自己新建一個(gè)d.ts文件重寫一下它的的類型

interface Imsg {
    msg: string
}

declare module "koa" {
    interface Request {
        body: {} | null | undefined | Imsg;
        rawBody: {} | null | undefined;
    }
}
2018年5月21日 12:11
編輯回答
青瓷

補(bǔ)充一個(gè)比重寫.d.ts更方便快捷的方式吧。找一個(gè)方便的地方,復(fù)制粘貼

/**
 * 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

無(wú)公害,不會(huì)覆蓋原始的Request,其他文件不受影響。而且,上游更新下游也會(huì)自動(dòng)更新,雖然不是正經(jīng)的繼承,但相當(dāng)近似了。

2017年10月17日 11:32