Почему `Record` нельзя применить тип распространения в машинописи? - PullRequest
0 голосов
/ 26 октября 2018
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,
                }
            },
        }
}

1 Ответ

0 голосов
/ 07 ноября 2018

Это ограничение текущей (по состоянию на 3.1) реализации распространения в Typescript.

Хорошая новость заключается в том, что следующая версия (3.2) Typescript исправит это. Два PR, которые улучшают обработку параметров расширения и отдыха: Общие переменные и параметры покоя объекта и Общие выражения распространения в литералах объекта Пока это еще не выпущено, вы можете попробовать его теперь используя npm install typescript@next.

С 3.2 ваш код работает как есть.

3.2 Должен быть выпущен в ближайшее время, где-то в ноябре 2018 года

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...