为什么`Record`不能在打字稿中应用传播类型?

时间:2018-10-26 03:33:15

标签: reactjs typescript redux

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扩展了字符串而T扩展了任意字符串,在这种情况下,它应该允许使用扩展类型。但是打字稿不能并抛出err

[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,
                }
            },
        }
}

1 个答案:

答案 0 :(得分:3)

这是对Typescript中的spread的当前(自3.1版本开始)实现的限制。

一个好消息是Typescript的下一个版本(3.2)将解决此问题。改善传播和休息参数处理的两个PR:Generic object rest variables and parametersGeneric spread expressions in object literals虽然尚未发布,但您现在可以使用npm install typescript@next进行尝试。

在3.2版本中,您的代码照常运行。

3.2应该在2018年11月的某个时间不久发布