Node.js Typescript如何将Request.payload分配给自定义接口

时间:2018-07-10 18:35:39

标签: javascript node.js typescript hapijs

我在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的信息。

如何定义类型并将有效负载直接分配给它?

1 个答案:

答案 0 :(得分:0)

<object>类型断言不起作用,因为SampleInput不仅是一些随机对象,而且object基本上指定了一个对象,即没有原始对象的非原始类型特定键(请参见this great explanation)。 SampleInputobject的超集。可以将SampleInput分配给object变量,反之亦然。

考虑到payloadSampleInput的原因,因为它已在运行时进行了验证,因此应该为:

const input = <SampleInput>request.payload;

由于request.payload string |,因此可以正常使用对象 |缓冲液| internal.Readable ,因此可以断言为 SampleInput (否则可能需要像<SampleInput><any>request.payload这样的黑客程序。)