Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why `Record` cannot be applied spread type in typescript?

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,
                }
            },
        }
}
like image 766
Tom Le Avatar asked Oct 24 '25 03:10

Tom Le


1 Answers

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

like image 160
Titian Cernicova-Dragomir Avatar answered Oct 26 '25 17:10

Titian Cernicova-Dragomir