Я пытаюсь обернуть свой объект 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
};
}