要增强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();
这是正确的方法吗?
答案 0 :(得分:1)
虽然我们无法修改接口中现有字段的类型,但是在这种情况下,我们可以修改字段的类型。字段的类型为Util.Dictionary<ServerMethod>
。尽管Util.Dictionary
在多个地方都使用,但它与类型参数ServerMethod
一起使用的唯一地方是该成员。
我们可以使用其他方法扩展Dictionary
接口,并仅在类型参数为ServerMethod
时才显示这些方法(我们也从here到如果T
为any
,则不显示方法
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
....