تایپاسکریپت - بازگرداندن 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'. Property 'then' does not exist on type 'false'.

هر کمکی بسیار قدردانی خواهد شد، متشکرم!

پاسخ شماره ۱

اگر هیچ چیزی به عنوان 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

خب، امیدوارم مفید باشد؛ موفق باشی!

لینک زمین بازی به کد