У меня есть функция под названием prepareOnTick, которая возвращает функцию, которая принимает обещание и добавляет некоторую логику в обратные вызовы обещания then catch finally.

const prepareOnTick = (onPerItemSettle: OnPerItemSettle) => {
  return (promise: Promise<any>) => {
    promise
      .then(
        () => {
          onPerItemSettle.onSuccess?.();
        },
        () => {
          onPerItemSettle.onError?.();
        }
      )
      .finally(() => {
        onPerItemSettle.onSettled?.();
      });

    return promise;
  };
};

const onTick = prepareOnTick({...})

Я хочу, чтобы тип onTick отражал тот факт, что какое бы обещание оно ни принимало, оно вернет его как есть. Но теперь его тип - (promise: Promise<any>) => Promise<any>, что не совсем точно. Полагаю, это должно быть (promise: Promise<T>) => Promise<T>.

Итак, я попытался напечатать это так

const prepareOnTick = (onPerItemSettle: OnPerItemSettle) => {
  return <T>(promise: Promise<T>):  Promise<T>=> {
    promise
      .then(
        () => {
          onPerItemSettle.onSuccess?.();
        },
        () => {
          onPerItemSettle.onError?.();
        }
      )
      .finally(() => {
        onPerItemSettle.onSettled?.();
      });

    return promise;
  };
};

Но компилятору TS, по-видимому, не нравятся мои аннотации типов, поэтому я, должно быть, делаю что-то не так. Это демонстрационная может кто-нибудь взглянуть на это?

0
Joji 13 Ноя 2020 в 01:05

1 ответ

Лучший ответ

Вы забыли добавить дополнительную запятую после общего параметра здесь: return <T,>

const prepareOnTick = (onPerItemSettle: OnPerItemSettle) => {
  // TS compiler does not like <T>, he likes more <T,> or <T extends unknown> because of 
  // JSX :D
  return <T,>(promise: Promise<T>):  Promise<T>=> {
    promise
      .then(
        () => {
          onPerItemSettle.onSuccess?.();
        },
        () => {
          onPerItemSettle.onError?.();
        }
      )
      .finally(() => {
        onPerItemSettle.onSettled?.();
      });

    return promise;
  };
};

Вам следует взглянуть на этот вопрос

1
captain-yossarian 12 Ноя 2020 в 22:50