تایپاسکریپت - تعریف نوع برای پارامتر شیء که میتواند ساختارهای مختلف داشته باشد


من یک تابع دارم که یک شیء را به عنوان آرگومان خود میگیرد، اما اشیاء ارسال شده میتوانند ساختارهای مختلفی داشته باشند. چگونه میتوانم یک نوع/انواع برای آرگومان تعریف کنم، بدون اینکه مجبور باشم هیچیک از ویژگیهای شیء را اختیاری قرار دهم (چون این کار باعث میشود کل تایپگذاری خیلی کمتر مفید باشد)؟

چیزی که دوست دارم انجام دهم، اما ظاهراً کار نمیکند، چیزی شبیه این است:

type One = {
  a: string
  b: string
}

type Two = {
  c: string
  d: string
}

type Three = {
  e: string
}

type OneOfTheseTypes = One | Two | Three

const myGenericFunction = (obj: OneOfTheseTypes) => {...}

پ.ن. من تازه دارم اولین قدمهای کوچکم را با تایپاسکریپت برمیدارم، بنابراین لطفاً مرا ببخشید اگر دارم در این مورد کاملاً اشتباه فکر میکنم!

ویرایش: پس این تابع یک شیء از همان نوعی که به آن داده شده است برمیگرداند، و وقتی از شیء برگردانده شده استفاده میکنم (مثل returnedObj.a) خطاهایی دریافت میکنم که میگویند «Property 'a' does not exist on type 'OneOfTheseTypes'.» و «Property 'a' does not exist on type 'Two'.» من از تایپاسکریپت همراه با React استفاده میکنم، نمیدانم آیا این موضوع مربوط به آن است یا نه.

پاسخ شماره ۱

مثال در سوال شما کار میکند و هیچ خطای کامپایل در مثال شما وجود ندارد. شما میتوانید به راحتی مسئله خود را با استفاده مستقیم از generics حل کنید:

type One = {
  a: string
  b: string
}

type Two = {
  c: string
  d: string
}

type Three = {
  e: string
}

const myGenericFunction = <T>(obj: T): T => obj;

const testObject: One = {
  a: 'fieldA',
  b: 'FieldB'
};

myGenericFunction<One>(testObject);

اطلاعات بیشتر در مورد جنریکها.

پاسخ شماره ۲

TypeScript پیغام خطای صحیحی دارد که میگوید ویژگی 'a' در OneOfTheseTypes وجود ندارد. اما میتوانید نتیجه خود را به یک نوع محدود با عملگر as تبدیل کنید اگر از این موضوع مطمئن هستید.

با این حال مراقب باشید: اگر نتیجه شما نوع Two یا Three داشته باشد، با خطای زمان اجرا مواجه خواهید شد.

let one: One = {
    a: 'hi',
    b: 'bye'
}

let res = myGenericFunction(one);
(res as One).a; // OK