Я пытаюсь создать функцию, которая возвращает Promise или Normal Value.
type Flow1 = <T, U>(a: T | Promise<T>, f: (a: T) => U) => U | Promise<U>
export const flow1: Flow1 = (a, f) => (a instanceof Promise ? a.then(f) : f(a))
flow1(Promise.resolve(4), (n) => n ** 2).then(console.info)
// Property 'then' does not exist on type 'number | Promise<number>'
Но я получаю сообщение об ошибке при привязке к функции. Я понятия не имею, что не так с этим набором текста.
export function flow1<T, U>(a: T, f: (a: T) => U): U {
return f(a)
}
export function flow2<T, U>(a: Promise<T>, f: (a: T) => U): Promise<U> {
return a.then(f)
}
flow1(1, (n) => n ** 2)
flow2(Promise.resolve(1), (n) => n ** 2).then(console.info)
Хорошо, есть ли способ перегрузить с тем же именем функции? :(
Хотя функция flow1
может внутри себя различать аргумент a
, который является обещанием, и простое значение, TS не позволяет выводу распространяться наружу.
Вам нужно будет изучить возвращаемое значение, чтобы увидеть, можете ли вы вызвать для него .then
:
type Flow1 = <T, U>(a: T | Promise<T>, f: (a: T) => U) => U | Promise<U>
export const flow1: Flow1 = (a, f) => (a instanceof Promise ? a.then(f) : f(a))
const result = flow1(Promise.resolve(4), (n) => n ** 2);
if (result instanceof Promise) {
result.then(console.info);
}
Вы также можете использовать перегрузку, но она требует некоторого шаблонного кода:
type Flow1 = {
<T, U>(a: T, f: (a: T) => U): void;
<T, U>(a: Promise<T>, f: (a: T) => U): Promise<U>;
};
const flow1: Flow1 = <T, U>(a: T | Promise<T>, f: (a: T) => U) => (a instanceof Promise ? a.then(f) : f(a));
flow1(Promise.resolve(4), (n: number) => n ** 2).then(console.info)
Не могли бы вы рассказать мне, как написать перегрузку с выражением function
? Есть ли способ добиться этого? Нравится ts function flow1(): T function flow1(): Promise<T> { // ... }
В смысле без отдельного type
? Это было бы очень некрасиво, но в основном просто скопируйте и вставьте содержимое типа поверх Flow1
. const flow1: { <T, U>(a: T, f: (a: T) => U): void;
и т. д. Слишком тяжело читать.
Попробуйте использовать перегрузки машинописного текста. Если аргумент обещание - вернуть обещание