2

我正在尝试使用 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 数据属性似乎不受类型声明的影响。

4

1 回答 1

4

仅仅因为某些东西与类具有相同的属性并不意味着它是类的实例。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);
});
于 2018-06-06T18:53:19.723 回答