Pesquisa de site

javascript - Como posso lidar com o status 204 usando Typescript e fetch?


Estou tentando criar uma requisição POST usando fetch e TypeScript. Mas não consigo criar um manipulador para o status 204.

Eu já tentei retornar uma promessa com valor nulo, mas não funciona.

    postRequest = async <T>(url: string, body: any): Promise<T> => {
        const response = await fetch(url, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json;charset=utf-8'
            },
            body: JSON.stringify(body)
        });

        // here is my problem
        if (response.status === 204) {
            // error is: "Type 'null' is not assignable to type 'T'."
            return null;
            // I have tried to return promise, but it doesn't work.
            // error is: "Argument of type 'null' is not assignable to 
            // parameter of type 'T | PromiseLike<T> | undefined'."
            return new Promise(resolve => resolve(null));
        }

        if (!response.ok) {
            throw new Error(response.statusText);
        }

        return await response.json() as Promise<T>;
    };


    postRequest<{data: boolean}>('request', { someValue: 1234 });

Resposta #1

Use um Tipo União para indicar que ou um Promise<T> ou um Promise<null> é retornado:

postRequest = async <T>(url: string, body: any): Promise<T | null> => {

Neste exemplo, o tipo de retorno é Promise<T | null>, o que indica que T ou null serão usados para uma promise resolvida.

Resposta #2

Se você quer que sua função retorne possivelmente null, você tem que adicioná-lo ao tipo de retorno.

postRequest = async <T>(url: string, body: any): Promise<T|null> => {
...
}

E você não precisa aguardar o valor de retorno em uma função assíncrona, a promessa criada já lida com a espera por você:

return response.json() as T;

Artigos relacionados