استفاده از عناصر جریان عمومی برای معرفی اجزای React عمومی

این پست بخشی از یک سری مقالات کوچک غیر رسمی است که بر استفاده از انواع Flow تمرکز دارد که در چند ماه گذشته کشف کردهام و مفید بودهام. اولین مقاله از این مجموعه را می توانید در اینجا بیابید اینجا.
ایجاد کامپوننتهای مشترک React میتواند راهی عالی برای سادهسازی پایگاه کد پروژه باشد. با ترکیب عملکردهای همپوشانی در یک مؤلفه، آنتروپی مؤلفه را کاهش می دهیم و در نتیجه میزان آزمایش مورد نیاز را کاهش می دهیم. با این حال، معرفی کامپوننتهای React عمومی میتواند در ابتدا کمی خستهکننده باشد، بهخصوص زمانی که تازه شروع به کار با Flow کردهاید. این پست بر روی نمونهای از یک کامپوننت React عمومی که چند ماه پیش برای نوشتن آن مشکل داشتم و اینکه چگونه کدهای عمومی Flow به من کمک کرد نه تنها بر مشکلات تایپ کردن غلبه کنم، بلکه یک نوع مقیاسپذیر برای آن کامپوننت نیز ایجاد کنم، تمرکز خواهد کرد.
از چندین مؤلفه معرفی شده به یک
در پروژهای که روی آن کار میکردم، مجبور بودم منابع متعددی را مدیریت کنم (که در اینجا نامگذاری شده است Resource1، Resource2، Resource3، … برای سادگی). هر منبع همکار خود را داشتList جزء (Resource1List، Resource2List، …) که هر کدام از نظر اجرا کاملاً مشابه سایرین بودند، زیرا منابع خود به جز چند تفاوت کاملاً مشابه بودند. در زیر انواع آن را مشاهده می کنید Resource1 و Resource2 :
نمونه ای از انواع جریان منابع
So given these specs, I wanted to build a single ResourceList component to display items of a given resource. Its props would include an onItemClick callback function, which takes a variable of that resource type as an argument. Here’s the first type that I wrote for the props of the ResourceList component:
The first iteration of the “Props” Flow type for ResourceList
Now that the component is typed, the next step consists of trying to use it with one of our Resources. Here’s how ResourceList can be used for Resource1 for example:
Resource1List React component using ResourceList
1
import React from 'react';2
import ResourceList from 'components/ResourceList';3
import type { Resource1 } from 'core/types';6
class Resource1List extends React.Component {7
onResource1Click = (item: Resource1) => {8
const { name, id } = item;15
return ResourceList onItemClick={this.onResource1Click(item)} />;
این زمانی بود که به مشکل اصلی برخورد کردم. با توجه به روشی که من این کامپوننت را معرفی کردم، اجرای Flow در برابر کد موجود در مثال بالا یک خطا ایجاد می کند:
در انواع منابعی که در بالا اعلام کردیم ( Resource1، Resource2 ، ...)، می بینید که کلید فیلد "id" هر منبع مطابقت ندارد. بنابراین وقتی از این کامپوننت استفاده می کنیم و an را می نویسیم onItemClick تابع برای یک منبع، Flow به شما خطایی می دهد که به ما می گوید ویژگی های منابع دیگر از دست رفته اند.
برای غلبه بر این نوع شرایط، داروهای ژنریک می توانند بسیار کاربردی باشند. در اینجا نحوه نوشتن این مؤلفه و رفع این مشکل آمده است:
-
ما می توانیم عمومی ارائه دهیم
BasePropsنوعی که یک نوع عمومی را می پذیردT -
استفاده کنید
TداخلBasePropsبرای ماonItemClickتابعی که یک عنصر از نوع را می گیردTبه عنوان یک استدلال و بنابراین از نوع باشدT => void -
من اعلام می کنم
Resource1Props،Resource2Propsو غیره بر اساسBaseProps -
نوع را بنویس
Propsبه عنوان سرشماری ازResource1Props،Resource2Propsو غیره
کد حاصل به شکل زیر است:
نوع جریان "Props" از ResourceList با استفاده از نوع جریان عمومی BaseProps
3
onItemSelect = T => void,6
type Resource1Props = BasePropsResource1>;7
type Resource2Props = BasePropsResource2>;9
type Props = Resource1Props | Resource2Props;
یک جریان اجرایی با این نوع باید خروجی زیر را داشته باشد:

اکنون به لطف Flow جزء لیست مشترک خود را به درستی پیاده سازی کرده ایم. ما می بینیم که استفاده از ژنریک ها نه تنها انعطاف پذیری را برای نوع ما به ارمغان می آورد، بلکه در آینده زمانی که بخواهیم استفاده از این مؤلفه را افزایش دهیم تا بتوان با منابع بیشتری از آن استفاده کرد، کمک خواهد کرد.



