gpt4 book ai didi

typescript - 使用 TypeScript 时如何扩充 Hapi.js 服务器方法?

转载 作者:搜寻专家 更新时间:2023-10-30 21:46:23 24 4
gpt4 key购买 nike

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

import { Server } from 'hapi';

declare module 'hapi' {

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

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

readonly methods: Util.Dictionary<ServerMethod>;

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

作为解决方法,我创建了一个新的 Hapi.js Server 接口(interface)来扩展原始接口(interface)。因此,我没有使用 hapi Server 接口(interface),而是使用了我创建的接口(interface):

// 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();

这是正确的方法吗?

最佳答案

虽然我们不能修改接口(interface)中现有字段的类型,但在这种情况下我们可以修改字段的类型。字段类型为Util.Dictionary<ServerMethod> .同时 Util.Dictionary在几个地方使用,唯一与类型参数一起使用的地方 ServerMethod是给这个成员(member)的。

我们可以扩展 Dictionary与额外方法的接口(interface),并且仅在类型参数为 ServerMethod 时才显示这些方法(如果 Tany,我们还做了一些来自 here 的魔术 insipider 以不显示方法)

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 创建一个新接口(interface)....

关于typescript - 使用 TypeScript 时如何扩充 Hapi.js 服务器方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54213306/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com