تایپاسکریپت - بازگرداندن Promise یا boolean بسته به پارامترها با یک مقدار پیشفرض
من کدی دارم که بسته به پارامترها یا یک مقدار بولی برمیگرداند یا یک پرامیس.
function setGuid<B extends boolean>(guid: string, shouldValidate?: B): B extends true ? boolean : Promise<boolean>
function setGuid(guid: string, shouldValidate?: boolean): boolean | Promise<boolean> {
if (shouldValidate){
return true
}
return Promise.resolve(true);
}
این قابلیت کار میکند. اگر من setGuid("*", false) را صدا بزنم، متوجه میشود که نوع بازگشتی یک Promise<boolean> خواهد بود، و به همین ترتیب اگر setGuid("*", true) را صدا بزنم، TypeScript متوجه میشود که نوع بازگشتی یک boolean خواهد بود.
مشکل این است که نمیتوانم راهی برای تعیین نوع بازگشتی پیشفرض پیدا کنم، که در اینجا Promise<boolean> باشد اگر shouldValidate (یک پارامتر اختیاری) ارائه نشود - من میخواهم تایپاسکریپت بفهمد که setGuid("*") باز میگردد Promise<boolean>. در حال حاضر اگر بهطور صریح false را به عنوان پارامتر دوم ارائه نکنم، فکر میکند که boolean | Promise<boolean> بازگردانده میشود.
خطایی که هنگام فراخوانی setGuid("*") دریافت میکنم این است: Property 'then' does not exist on type 'boolean | Promise
هر کمکی بسیار قدردانی خواهد شد، متشکرم!
پاسخ شماره ۱
اگر هیچ چیزی به عنوان shouldValidate وارد نکنید، کامپایلر نمیتواند نوع B را استنباط کند. در نتیجه، به طور پیشفرض تمایل دارد از محدودیت خود استفاده کند که همان boolean است. این رفتار ضعیفی دارد چون B extends true ? boolean : Promise<boolean> به اتحاد boolean | Promise<boolean> تبدیل میشود، همانطور که دیدهاید.
در این مورد، شما میتوانید یک پارامتر عمومی پیشفرض به امضای فراخوانی سربار اضافه کنید، مانند این:
function setGuid<B extends boolean = false>(
guid: string,
shouldValidate?: B
): B extends true ? boolean : Promise<boolean>;
اگر کامپایلر نتواند B را بهطور دیگری استنتاج کند، از این مقدار پیشفرض استفاده خواهد کرد:
setGuid("*").then(x => x ? 0 : 1); // no error now
خب، امیدوارم مفید باشد؛ موفق باشی!
لینک زمین بازی به کد
