我在hapi.js框架中有一个node.js API。我想为用户输入有效负载创建接口。例如:
路线定义:
{
path: "/sample",
method: "POST",
handler: myHandler,
options: {
validate: {
payload: {
number1: joi.number().required(),
string1: joi.string().required(),
number2: joi.number(),
}
}
}
}
处理程序:
interface SampleInput {
number1: number;
string1: string;
number2?: number;
}
const myHandler = async (request, h): Promise<string> => {
const input: SampleInput = request.payload;
// any works but really want to get rid of this
const _input: any = request.payload;
const input: SampleInput = _input;
// Service body
return "Hello World";
}
此代码始终显示诸如Request.payload is not assignable to Sample
之类的错误。 Request.payload
的类型为string | object | Buffer | internal.Readable
。我尝试使用类型防护const input: SampleInput = (<object>request.payload);
,但仍然得到类似{} is not assignable to Sample
的信息。
如何定义类型并将有效负载直接分配给它?
答案 0 :(得分:0)
<object>
类型断言不起作用,因为SampleInput
不仅是一些随机对象,而且object
基本上指定了一个对象,即没有原始对象的非原始类型特定键(请参见this great explanation)。 SampleInput
是object
的超集。可以将SampleInput
分配给object
变量,反之亦然。
考虑到payload
是SampleInput
的原因,因为它已在运行时进行了验证,因此应该为:
const input = <SampleInput>request.payload;
由于request.payload
是 string |,因此可以正常使用对象 |缓冲液| internal.Readable ,因此可以断言为 SampleInput (否则可能需要像<SampleInput><any>request.payload
这样的黑客程序。)