Axios generic Post在TypeScript中返回错误的类型

时间:2018-06-06 18:08:15

标签: javascript typescript generics axios typescript-generics

我正在尝试使用Axios API返回一个类型化对象。我使用泛型类型来声明我正在返回#!/usr/bin/env ruby 的实例但不幸的是,Axios似乎仍然返回任何类型的对象。

我的代码看起来像这样

GetSliceResponse

Http响应正如您所期望的那样:

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;
});

如上面的代码所示,我可以使用{"Success":false} 语法正确创建我的类型的实例,但Axios数据属性不受类型声明的影响。

1 个答案:

答案 0 :(得分:1)

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

post方法的类型参数旨在帮助描述响应的形状,但实际上不会改变运行时行为(也不会在编译期间擦除遗传)。

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

如果你想确保没有人误用instanceof,你可以改为使用类型am接口。

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

export class GetSliceResponse 
{
    Success: boolean;
}

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