代码之家  ›  专栏  ›  技术社区  ›  Maxim Gershkovich

axios generic post在typescript中返回错误的类型

  •  2
  • Maxim Gershkovich  · 技术社区  · 6 年前

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

    1 回复  |  直到 6 年前
        1
  •  2
  •   Titian Cernicova-Dragomir    6 年前

    仅仅因为某个类具有与该类相同的属性并不意味着它是该类的实例。在您的情况下,可能会使用 JSON.parse 它将创建简单的对象。仅使用创建的对象 new GetSliceResponse 实际上是类的实例。

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

    这就是说,您仍然可以访问对象的属性,就像该对象是类的实例一样,唯一不起作用的是 instanceof 别指望有什么办法。

    如果你想确保没有人使用 运算符 错误地,您可以改为使用类型AM接口。

    如果您真的需要这个类,可以使用 new 使用 Object.assign 分配所有字段

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