جاوااسکریپت - استفاده از جنریکها برای تعیین نوع متدهای تابع پیکان defaultProp در ریاکت
پس ما با مشکلی مواجه شدیم که یک رابط داریم که روشی برای ایجاد استایلها ارائه میدهد. این روش یک نوع عمومی میپذیرد و نوع بازگشتی را به این صورت پارامتردهی میکند، ببینید در زیر:
export interface StyleConfig {
rootContainer: any;
}
export default interface AcceptsStyles {
createStyles: <C extends StyleConfig>(theme: any) => C;
}
اکنون در کلاسی که از این رابط استفاده میکند، ما در تلاش هستیم رابطی را پاس کنیم که میخواهیم C باشد:
export const defaultProps: Partial<Props<any>> = {
createStyles: function <ListItemStyleConfig>(theme: any): ListItemStyleConfig { return Styles(theme) },
};
ما توانستیم این کار را با استفاده از یک تعریف تابع معمولی انجام دهیم؛ با این حال، اگر بخواهیم آن را با یک تابع پیکانی امتحان کنیم، به مشکل بر میخوریم:
createStyles<ListItemStyleConfig>: (theme: any): ListItemStyleConfig => Styles(theme),
من مطمئن نیستم که آیا ما فقط پارامتردهی این را به روش درست انجام میدهیم یا نه، اما ما با خطاهایی مانند Type '<ListItemStyleConfig>() => (theme: any) => any' is not assignable to type '<C extends StyleConfig>(theme: any) => C'. Type '(theme: any) => any' is not assignable to type 'C'. مواجه میشویم
آیا کسی ایدهای دارد که چگونه میتوانیم عملاً با توابع فلش همان کاری را انجام دهیم که با تعریف تابع معمولی انجام میدهیم، و آیا این حتی راه صحیح برای انجام آن است؟
پاسخ شماره ۱
شاید نیازی به <ListItemStyleConfig> در createStyles خود نداشته باشید، کامپایلر TS تقریباً همیشه قادر است نوع ژنریک را از مقدار برگشتی تابع شما استنباط کند.
createStyles: (theme: any): ListItemStyleConfig => Styles(theme) // As long as Props extends AcceptsStyles, the function will be correctly inferred and valid
بسته به نوع بازگشتی Styles، ممکن است حتی به نوع بازگشتی نیاز نداشته باشید (و میتواند استنباط شود)، به عنوان مثال.
createStyles: (theme: any) => Styles(theme) // should infer the generic from return type of Styles
یا، بسته به امضای Styles (و اینکه آیا از this نامحدود استفاده میکند یا نه)، شما حتی میتوانید آن را به طور مستقیم به این شکل ارسال کنید:
createStyles: Styles // equivalent to theme => Styles(theme) as long as binding is the same and Styles takes only a single parameter
کامپایلر TypeScript تقریباً همیشه قادر است انواع جنریک را برای شما استنباط کند! من سعی میکنم از اعلان آشکار آنها خودداری کنم مگر اینکه ابهامی وجود داشته باشد.
