نوع اتحادیه دو تابع در تایپاسکریپت
من یک وضعیت دارم که در آن نوعی دارم که اتحاد دو تابع است که هرکدام یکی از آرگومانهایشان نوعی دارای مقدار واقعی است. به مثال مینیمال کاهش داده شده، اساساً این است:
type FetchMini = (id: number, representation: 'mini') => MiniUser;
type FetchFull = (id: number, representation: 'full') => FullUser;
function f(fetchUser: FetchMini | FetchFull) {
fetchUser(2, 'mini');
fetchUser(2, 'full');
}
هر دوی این فراخوانیها کامپایلر را با پیام زیر شکست میدهند:
نمیتوان یک عبارت را که نوع آن فاقد امضای فراخوانی است، فراخوانی کرد. نوع 'FetchMini | FetchFull' هیچ امضای فراخوانی سازگاری ندارد.
من فکر میکنم علت اینکه این اتفاق میافتد را میفهمم، (...فکر میکنم) اما میتوانم در اینباره چه کاری انجام دهم؟
در اینجا یک سؤال مشابه وجود دارد، با این حال هیچ جوابی دریافت نکرده است: اجتماع توابع حتی با پارامترهایی که محدودیتهای هر تابع را رعایت میکنند، قابل فراخوانی نیست.
پاسخ شماره ۱
تابع fetchUser() شما اساساً یک تابع چندبارهتعریفشده است که هم mini و full را میپذیرد، بنابراین باید به صورت intersection تایپ شود، نه ترکیبی (union).
type MiniUser = { name: string }
type FullUser = { firstName: string, lastName: string, age: number }
type FetchMini = (id: number, representation: 'mini') => MiniUser;
type FetchFull = (id: number, representation: 'full') => FullUser;
type FetchBoth = FetchMini&FetchFull
function f(fetchUser: FetchBoth) {
fetchUser(2, 'mini');
fetchUser(2, 'full');
}
function fetchBoth(id: number, representation: 'mini'): MiniUser
function fetchBoth(id: number, representation: 'full'): FullUser
function fetchBoth(id: number, representation: 'mini' | 'full') {
if (representation==='mini')
return { name: 'Mini' }
if (representation==='full')
return { firstName: 'Full', lastName: 'User', age: 20 }
}
f(fetchBoth)
PlayGround
به طور کلی، وقتی تابعی را تعریف میکنید که آرگومانهایی از هر دو نوع A و B قبول میکند، تابع باید از نوع & باشد.
