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

Tom*_* Le 2 typescript reactjs 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,
}
Run Code Online (Sandbox Code Playgroud)

所以你可以看到 K 扩展 string 和 T 扩展 any,在这种情况下它应该允许使用扩展类型。但是 typescript 不允许并抛出错误

[ts] Spread types may only be created from object types.
const addtionalResourse: Record<K, T>
Run Code Online (Sandbox Code Playgroud)

完整代码在这里:

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,
                }
            },
        }
}
Run Code Online (Sandbox Code Playgroud)

Tit*_*mir 5

这是当前(自 3.1 起)Typescript 中传播实现的限制。

好消息是 Typescript 的下一个版本 (3.2) 将解决这个问题。改进扩展和剩余参数处理的两个 PR 是:通用对象剩余变量和参数以及对象文字中的通用扩展表达式虽然尚未发布,但您现在可以使用npm install typescript@next.

在 3.2 中,您的代码可以按原样运行。

3.2 应该会很快发布,即 2018 年 11 月的某个时间