reactjs - چرا `Record` نمیتواند در تایپ اسکریپت به نوع اسپرد اعمال شود؟
export type AddResourceProps<K extends string, T extends any> = (resource: BasicResource) => Record<K, T>
const addtionalResourse = addResourceProps ? addResourceProps(resource) : {} as Record<K,T>
const result = {
...addtionalResourse,
}
پس میتوانید ببینید که K از نوع string و T از نوع any گسترش مییابد، در این حالت باید اجازه استفاده از نوعهای spread را میداد. اما تایپاسکریپت این کار را انجام نمیدهد و خطا میدهد
[ts] Spread types may only be created from object types.
const addtionalResourse: Record<K, T>
کد کامل در اینجا:
export type AddResourceProps<K extends string, T extends any> = (resource: BasicResource) => Record<K, T>
export const buildResourceFromRedux = <A extends ActionCollection, AT, S,K extends string, T>
(getReduxModule: IGetRedux<A, AT, S>, addResourceProps?: AddResourceProps<K, T> ) => {
return {
getRedux: (reduxConfig: IResourceReduxConfig) => {
const reduxModule = getReduxModule(reduxConfig)
return {
...reduxModule,
...reduxConfig,
}
},
getResource: () => {
const reduxModule = getReduxModule({ name: 'resource', local: ['resource']})
const store = getStore(reduxModule.reducer, reduxModule.saga, { name: 'resource' })
// Action
const resource = {
store,
}
const addtionalResourse = addResourceProps ? addResourceProps(resource) : {} as Record<K,T>
return {
...resource,
...addtionalResourse,
}
},
}
}
پاسخ شماره ۱
این یک محدودیت در پیادهسازی فعلی (تا نسخه ۳.۱) استفاده از spread در تایپاسکریپت است.
خبر خوب این است که نسخه بعدی (۳.۲) تایپاسکریپت این مشکل را برطرف خواهد کرد. دو PR که به بهبود مدیریت پارامترهای spread و rest کمک میکنند عبارتند از: متغیرها و پارامترهای rest شیء عمومی و عبارات spread عمومی در literals شیء. اگرچه این نسخه هنوز منتشر نشده است، میتوانید هماکنون آن را با استفاده از npm install typescript@next امتحان کنید.
با نسخه ۳.۲ کد شما به همین شکل کار میکند.
3.2 به زودی، در اواخر نوامبر 2018 منتشر خواهد شد