Как правильно реализовать функцию-обертку в TypeScript? - PullRequest
2 голосов
/ 15 января 2020

TL; DR;

Почему я получаю эту ошибку ?


Я перехожу с ES6 на TypeScript и получаю ошибку Type 'number' is not assignable to type 'never'.(2322) попытка переписать функцию для создания ловушки.

Первоначальная проблема проста: обернуть метод API, чтобы мне не нужно было передавать маркер доступа при каждом вызове.

Все методы, которые требуется, чтобы токен авторизации имел тот же родительский интерфейс:

export interface AuthParams {
    token: string;
}

Тривиальный пример метода API:

interface GetProfileParams extends AuthParams {
    id: number;
}
interface Profile {
    name: string;
}

async function getProfile(params: GetProfileParams): Promise<Profile> {
    return Promise.resolve({ name: 'John Doe' });
}

Я реализовал функцию, которая может создавать ловушку из любого Метод API, который требует токен авторизации. Хук использует токен из контекста React и связывает его как значение метода по умолчанию для параметра 'token':

import { useCallback } from 'react';

interface PrivateMethod<TParams extends AuthParams, TResult> {
    (params: TParams): TResult;
}

interface SecuredMethod<TParams extends AuthParams, TResult> {
    (params: Exclude<TParams, AuthParams>): TResult;
}

function createAuthorizedMethodHook<
    TParams extends AuthParams,
    TResult
>(
    method: PrivateMethod<TParams, TResult>,
): () => SecuredMethod<TParams, TResult> {
    return () => {
        return useCallback(
            params => method({ token: 'TOKEN FROM CONTEXT', ...params }),
            [],
        );
    };
}

Наконец, я пытаюсь использовать оболочку функции и получаю ошибку :

const useGetProfile = createAuthorizedMethodHook(getProfile);

const securedGetProfile = useGetProfile();

securedGetProfile({ id: 1 });
//                  ^^
// Type 'number' is not assignable to type 'never'.(2322)

Почему я получаю эту ошибку? Это ошибка? Должен ли я создать проблему на репозитории TypeScript ?

Протестировано на версии Typescript 3.7.4 и 3.8.0-dev.20200115.

1 Ответ

0 голосов
/ 15 января 2020

Я наконец-то решил эту проблему сам.

Я неправильно использовал утилиту TypeScript Extract.

Исправление :

interface SecuredMethod<TParams extends AuthParams, TResult> {
    (params: Omit<TParams, keyof AuthParams>): TResult;
}
params => method({ token: 'TOKEN FROM CONTEXT', ...params } as TParams)
...