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,
}
},
}
}
答案 0 :(得分:3)
这是对Typescript中的spread的当前(自3.1版本开始)实现的限制。
一个好消息是Typescript的下一个版本(3.2)将解决此问题。改善传播和休息参数处理的两个PR:Generic object rest variables and parameters和Generic spread expressions in object literals虽然尚未发布,但您现在可以使用npm install typescript@next
进行尝试。
在3.2版本中,您的代码照常运行。
3.2应该在2018年11月的某个时间不久发布