【问题标题】:Axios generic Post returns wrong type in TypeScriptAxios 通用 Post 在 TypeScript 中返回错误类型
【发布时间】:2018-11-16 12:33:59
【问题描述】:

我正在尝试使用 Axios API 返回一个类型化的对象。我正在使用泛型类型来声明我正在返回一个 GetSliceResponse 的实例,但不幸的是 Axios 似乎仍然返回了一个 any 类型的对象。

我的代码是这样的

export class GetSliceResponse 
{
    Success: boolean;
}

Axios.post<GetSliceResponse>("myurl/Get", request).then(o => {
    var expectedResult = (new GetSliceResponse()) instanceof GetSliceResponse;
    //expectedResult = true;
    var unexpectedResult = o.data instanceof GetSliceResponse;
    //unexpectedResult = false;
});

Http 响应正是您所期望的:

{"Success":false}

正如上面的代码所示,我可以使用new 语法正确地创建我的类型的实例,但 Axios 数据属性似乎不受类型声明的影响。

【问题讨论】:

    标签: javascript typescript generics axios typescript-generics


    【解决方案1】:

    仅仅因为某些东西与类具有相同的属性并不意味着它是类的实例。在您的情况下,来自服务器的响应可能是使用 JSON.parse 解析的,这将创建简单的对象。只有使用new GetSliceResponse 创建的对象才会真正成为该类的实例。

    post 方法的 type 参数旨在帮助描述响应的形状,但实际上不会改变运行时行为(也不可能,在编译过程中会删除基因)。

    话虽如此,您仍然可以访问对象的属性,就好像该对象是该类的实例一样,唯一不起作用的是instanceof,并且不要期望任何方法存在。

    如果您想确保没有人错误地使用instanceof,您可以改为使用 type am 接口。

    如果您确实需要该类,您可以使用new 创建一个实例并使用Object.assign 分配所有字段

    export class GetSliceResponse 
    {
        Success: boolean;
    }
    
    Axios.post<GetSliceResponse>("myurl/Get", request).then(o => {
        o = Object.assign(new GetSliceResponse(), o);
    });
    

    【讨论】:

    • 非常感谢 Titian,在查看了源代码之后,您说它所做的一切都是调用 JSON.parse 是绝对正确的。我可能不应该假设它实际上是在进行类型转换。您的解决方案简洁明了,效果很好。再次感谢。
    猜你喜欢
    • 2019-05-06
    • 2020-07-29
    • 2020-05-31
    • 2019-12-29
    • 2021-11-05
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多