Вы хотели бы сказать "Либо object
, который совсем не Promise
, либо Promise<object>
".К сожалению, концепцию "object
, которая не является Promise
" проще всего выразить как тип вычитания , который в настоящее время не поддерживается в TypeScript.
Один из способов продолжить вместо этого- описать тип объекта, который определенно не является Promise
и включает большинство не-примитивов, которые вы, возможно, захотите разрешить, без разрешения всех из них.Например, было бы разумно ожидать, что если возвращаемое значение nonPrimitiveResult()
содержит свойство с именем then
, то результатом будет Promise
.Или, что то же самое, если результат не a Promise
, тогда не содержит свойство с именем then
.Если это разумный компромисс, вы можете изменить object | Promise<object>
на {then?: never} | Promise<object>
.Тип {then?: never}
означает «это объект без определенного свойства then
».
В этом случае ваша подпись становится:
function nonPrimitiveResult(): { then?: never } | Promise<object> {
return {}; // OK
return 1; // Error
return undefined; // Error
return Promise.resolve({}); // OK
return Promise.resolve(1); // Error
return Promise.resolve(); // Error
}
, и все ваши дела ведут себя так, как вы хотели бы.Это обходной путь, конечно.Если утверждение «результат со свойством then
должен быть Promise
» не применяется на практике, то вы в конечном итоге запретите действительные объекты:
function nonPrimitiveResult(): { then?: never } | Promise<object> {
return {then: "theDinosaursCame"}; // Error, uh oh
}
Так что это не идеальное решение.Вы можете быть более умным и начать описывать объединение типов, которое более точно представляет «объект, который не является Promise
», например:
type NotAFunction = string | number | boolean | null | undefined | { call?: NotAFunction };
declare function nonPrimitiveResult(): { then?: NotAFunction } | Promise<object>;
, но которое становится все более и более сложным с меньшими затратами.и меньше предельной выгоды.Поэтому я, вероятно, просто придерживаюсь {then?: never}
, если не столкнусь с вариантом использования, который сделает его неработоспособным.
В любом случае, надеюсь, это поможет.Удачи!