使用TypeScript时如何增强Hapi.js服务器方法?

时间:2019-01-16 08:52:00

标签: typescript hapi

要增强hapi模块以添加服务器方法的类型检查,请执行以下代码:

import { Server } from 'hapi';

declare module 'hapi' {

    export interface Server {
        methods: {
            getUsername: () => Promise<string>;
        };
    }
}

但是,这不起作用,因为@types/hapi软件包已经将methods定义为:

readonly methods: Util.Dictionary<ServerMethod>;

根据这个As far as I know的StackOverflow问题,无法重新定义现有属性。但我不确定。我找不到与此有关的任何文档。 如果不是这种情况,如何添加/修补/修复类型信息?

作为一种解决方法,我创建了一个新的Hapi.js Server接口,该接口扩展了原始接口。因此,我不是使用hapi Server界面,而是使用我创建的界面:

// src/augment.d.ts
import { Server as HapiServer } from 'hapi';

export interface Server extends HapiServer {

    methods: {
        getUsername: () => Promise<string>;
    };
}

// In my file src/server.ts file
import { Server } from 'src/augment';

// NOW IT TYPECHECKS CORRECTLY
const username = server.methods.getUsername();

这是正确的方法吗?

1 个答案:

答案 0 :(得分:1)

虽然我们无法修改接口中现有字段的类型,但是在这种情况下,我们可以修改字段的类型。字段的类型为Util.Dictionary<ServerMethod>。尽管Util.Dictionary在多个地方都使用,但它与类型参数ServerMethod一起使用的唯一地方是该成员。

我们可以使用其他方法扩展Dictionary接口,并仅在类型参数为ServerMethod时才显示这些方法(我们也从here到如果Tany,则不显示方法

declare module 'hapi' {
    export namespace Util {
        type IfAny<T, Y, N> = 0 extends (1 & T) ? Y : N; 
        export interface Dictionary<T> {
            getUsername<T extends ServerMethod>(this: Dictionary<T> & IfAny<T, never, {}>) : Promise<string>;
        }
    }
}

let d = new Server({})
let f!: Util.Dictionary<any>;

d.methods.getUsername() // type checked

注意 理想情况下,将为methods使用一个专用类型,该类型将允许我们在不扩展非常通用的Dictionary接口的情况下向其中添加方法,但是现在它们是正确的类型。有人可以提出拉取请求,以为methods ....

创建新接口