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,
}
So you can see K extends string and T extends any, in this case It should allow to use spread types.But typescript not and throw the err
[ts] Spread types may only be created from object types.
const addtionalResourse: Record<K, T>
The full code at here:
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,
}
},
}
}
This is a limitation of the current (as of 3.1) implementation of spread in Typescript.
The good new is that the next version (3.2) of Typescript will fix this. The two PRs that improve handling of spread and rest parameters are: Generic object rest variables and parameters and Generic spread expressions in object literals While this is not yet released, you can try it out now using npm install typescript@next.
With 3.2 your code works as is.
3.2 Should be released shortly, sometime in November 2018
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With