Вы можете исправить это, подняв тип Promise. Проблема в том, что boolean
является типом объединения, а условные типы автоматически распределяются по типам объединения . Рассмотрим следующий код:
type PossiblePromise<T, Y = Promise<T>> = T extends Promise<infer U>
? T | U
: T | Y;
type Z = PossiblePromise<boolean>;
const a = "a"
const f: () => Z = () => Promise.resolve(!!a);
Как вы можете видеть, Y
поднимается за пределами типа условия и используется только при необходимости.
Кстати, использование Boolean
не является исправлением ваше определение типа, это только другой тип, который хорошо работает с вашей реализацией (Boolean не является типом объединения) - рассмотрим подробнее о Boolean . Это также означает, что, если бы вы использовали любой другой тип объединения, он имел бы такой же неправильный эффект, проверьте ниже разницы
type T = "a" | "b";
// previous result type would be:
type PreviousResult = "a" | "b" | Promise<"a"> | Promise<"b">
// after the change it will be:
type Result = "a" | "b" | Promise<"a" | "b">