Axios generic Post возвращает неверный тип в TypeScript - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь вернуть типизированный объект с помощью Axios API.Я использую универсальный тип, чтобы объявить, что я возвращаю экземпляр GetSliceResponse, но, к сожалению, Axios по-прежнему возвращает объект любого типа.

Мой код выглядит так

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, по-видимому, не зависит от типадекларация.

1 Ответ

0 голосов
/ 06 июня 2018

То, что что-то имеет те же свойства, что и класс, не означает, что он является экземпляром класса.В вашем случае ответ от сервера, вероятно, анализируется с помощью JSON.parse, который создает простые объекты.Только объекты, созданные с использованием new GetSliceResponse, на самом деле будут экземплярами класса.

Параметр type для метода 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);
});
...