reactjs - combineReducers نوع را استنباط نمیکند


من در اپلیکیشن React TypeScript خود از combineReducers استفاده میکنم:

// combinedReducer.ts
import { combineReducers } from 'redux'
import reducer1 from './reducer1'
import reducer2 from './reducer2'

const combinedReducer = combineReducers({
    reducer1,
    reducer2,
})

export default combinedReducer

از مستندات Redux متوجه شدم که combineReducers باید نوع خود را بر اساس ریدوسرهای ترکیب شده استنتاج کند.

با این حال، برای من اینطور نیست، حتی با اینکه هر ترکیب کننده بازگردانده شده نوع بازگشتی خود را دارد:

( ReturnType<typeof combidedReducer> برابر unknown است)

در اینجا سادهترین ریدووسرهای من هستند:

// reducer1.ts
const initialState: boolean = false

const reducer1 = (state = initialState): boolean => state

export default reducer1
// reducer2.ts
const initialState: boolean = false

const reducer2 = (state = initialState): boolean => state

export default reducer2

پاسخ شماره ۱

همین مشکل برای من هم با استفاده از redux 4.0.5 و typescript 4.0.1 وجود دارد. مجبور شدم خودم یک استنتاجکننده بنویسم:

type BaseReducerMap<S> = {
    [K in keyof S]: (state: S[K], action: any) => S
}

export type InferRootState<ReducerMap extends BaseReducerMap<S>, S = any> = {
    [K in keyof ReducerMap]: ReturnType<ReducerMap[K]>
}

سپس برای مجموعهی ردیوسرهای خودتان (قبل از اینکه آنها را با هم ترکیب کنید)

const reducers = {
    login: loginReducer,
    chatUsers: chatUsersReducer,
};
const combinedReducer = combineReducers(reducers);

export type State = InferRootState<typeof reducers>;

سپس تایپاسکریپت میتواند نوع State من را با موفقیت استنباط کند. نمیدانم چرا در این نسخه شکست میخورد.

پاسخ شماره ۲

اطمینان حاصل کنید که Redux در نسخه ۴.۰.۰ یا بالاتر باشد. نگاشتهای نوع برای combineReducers با نسخه ۴.۰.۰ منتشر شد، در اینجا PR مربوطه در گیتهاب Redux آمده است.

شما میتوانید فایل package.json خود را بهروزرسانی کنید:

...
"dependencies": {
   "redux": "^4.0.3"
}
...

سپس برای بروزرسانی به آخرین نسخه، دستور npm install را اجرا کنید.

پس از اعمال این تغییر، مطمئن شوید که IDE خود را مجدداً راهاندازی کنید تا نگاشتههای نوع بارگذاری مجدد شوند.