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

How to augment Hapi.js server methods when using TypeScript?

扩充hapi模块为服务器方法添加类型检查,代码如下:

import { Server } from 'hapi';

declare module 'hapi' {

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

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

readonly methods: Util.Dictionary<ServerMethod>;

根据这个 Whosebug 问题,,无法重新定义现有的 属性。但我不确定。我找不到任何关于此的文档。 如果不是这种情况,我如何augment/patch/fix类型信息?

作为解决方法,我创建了一个新的 Hapi.js 服务器接口来扩展原始接口。因此,我没有使用 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();

这是正确的方法吗?

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

我们可以使用额外的方法扩展 Dictionary 接口,并让这些方法仅在类型参数为 ServerMethod 时显示(我们还从 如果 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...

创建一个新界面