Je suis en train de créer une API en écriture standard et certaines actions du contrôleur peuvent être synchrones alors que d'autres ne le peuvent pas. J'aimerais spécifier un type de réponse comme suit :
type ActionResult =IHttpActionResult | Promise<IHttpActionResult>;
Ensuite, au fur et à mesure que je construis des actions, lorsqu'elles deviennent basées sur des promesses, je peux simplement ajouter async et en finir.
Mais, Typescript se plaint que "le type de retour d'une fonction ou d'une méthode asynchrone doit être le type Promise global".
Pourquoi une fonction asynchrone ne peut-elle pas retourner une union de T | Promise<T>
?
Voici un exemple :
type StringPromise = Promise<string>;
// These two work as you'd expect
async function getHello(): Promise<string> {
return 'hello';
}
async function getGoodbye(): StringPromise {
return 'goodbye';
}
type StringyThingy = string | Promise<string>;
// the next two work as you would expect them to
function getHoorah(): StringyThingy {
return 'hoorah!';
}
function getWahoo(): StringyThingy {
return new Promise(resolve => resolve('wahoo'));
}
// This one results in the error:
// "the return type of an async function or method must be the global Promise type."
async function getSadface(): StringyThingy {
return ':(';
}
Voici quelques exemples de sorties pour le code ci-dessus :
getHello().then(console.log);
getGoodbye().then(console.log);
console.log(getHoorah());
// The library I'm using is probably using typeguards for this
// I'd imagine
const wahoo = getWahoo();
if (typeof(wahoo) === 'string') {
console.log(wahoo);
} else {
wahoo.then(console.log);
}