使用 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
时显示(我们还从 如果 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
...
创建一个新界面
扩充hapi
模块为服务器方法添加类型检查,代码如下:
import { Server } from 'hapi';
declare module 'hapi' {
export interface Server {
methods: {
getUsername: () => Promise<string>;
};
}
}
但是,这不起作用,因为 @types/hapi
包已经将 methods
定义为:
readonly methods: Util.Dictionary<ServerMethod>;
根据这个 Whosebug 问题,
作为解决方法,我创建了一个新的 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
时显示(我们还从 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
...