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 расширяет любую, в этом случае это должно позволить использовать типы распространения. Но машинописный текст нет и выдает ошибку
[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,
}
},
}
}
Это ограничение текущей (по состоянию на 3.1) реализации распространения в Typescript.
Хорошая новость заключается в том, что следующая версия (3.2) Typescript исправит это. Два PR, которые улучшают обработку параметров спреда и отдыха: Общие переменные и параметры покоя объекта и Универсальные выражения распространения в объектных литералах. Хотя он еще не выпущен, вы можете попробовать его сейчас, используя npm install typescript@next
.
В версии 3.2 ваш код работает как есть.
3.2 Должен быть выпущен в ближайшее время, где-то в ноябре 2018 г.