Почему машинописный текст не позволяет переопределить функцию с точно такими же параметрами и ReturnType ? - PullRequest
2 голосов
/ 17 июня 2020

Я пытаюсь обернуть свой объект Promise, чтобы реализовать какое-то общее c ведение журнала, но Typescript (в строгом режиме, конечно) дает мне довольно трудно переваривать ошибки. Вот что я пытаюсь сделать:

function wrapPromise<T>(promise: Promise<T>) {
    const oThen = promise["then"];

    promise["then"] = function (...args: Parameters<typeof oThen>): ReturnType<typeof oThen> {
  //^^^^^^^^^^^^^^^ error here
        // some wrapping code
        const retVal = oThen.apply(promise, args);
        // other wrapping code
        return retVal;
    };
}

Сообщение об ошибке:

Type '<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => unknown) | null | undefined, onrejected?: ((reason: any) => unknown) | null | undefined) => Promise<unknown>' is not assignable to type '<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null | undefined, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined) => Promise<...>'.
  Type 'Promise<unknown>' is not assignable to type 'Promise<TResult1 | TResult2>'.
    Type 'unknown' is not assignable to type 'TResult1 | TResult2'.
      Type 'unknown' is not assignable to type 'TResult2'.
        'TResult2' could be instantiated with an arbitrary type which could be unrelated to 'unknown'.(2322)

Я действительно не понимаю, как unknown вообще появляется, и у меня нет идея, что означает последняя строка в сообщении об ошибке. Наверняка это как-то связано с функцией отклонения. Но если я использую те же параметры и тип возвращаемого значения, почему функция не может быть назначена?

Обновление: даже если я не использую типы утилит, я получаю ту же ошибку в другом месте:

function wrapPromise<T>(promise: Promise<T>) {
    const oThen = promise["then"];

    promise["then"] = function <TResult1 = T, TResult2 = never>(
        onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null | undefined,
        onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined)
        : Promise<TResult1 | TResult2>{
        // some wrapping code
        const retVal = oThen.call(promise, onfulfilled, onrejected);
        // other wrapping code
        return retVal;
        //^^^^^^^^^^^ error here
    };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...