[英]How to infer generic paramter in return type in typescript
我有一個類型
export type AppThunk<ReturnType> = ThunkAction<
ReturnType,
RootState,
unknown,
Action<string>
>;
現在如果我使用它如下
export const loadCourse = (id: string): AppThunk => {
return (dispatch: Dispatch) => {
dispatch(loadCourseSuccess(undefined));
return api
.getCourse(id)
.then((course) => dispatch(loadCourseSuccess(course)));
};
};
typescript 編譯器抱怨並告訴我在 AppThunk 中提供泛型參數,如何使其自動推斷泛型返回類型參數?
這里有三個不同的問題:
AppThunk
類型現在,您的AppThunk
類型期望它必須被賦予一個通用參數ReturnType
。 因此,您必須將其用作AppThunk<TheActualReturnType>
- 在這種情況下,類似於AppThunk<Promise<void>>
,因為您並沒有真正從最終的.then()
中返回任何內容。
我們通常建議為AppThunk
類型賦予 `ReturnType 的默認值,因為許多 thunk 實際上並不返回任何內容,例如:
export type AppThunk<ReturnType = void> = ThunkAction<
ReturnType,
RootState,
unknown,
Action<string>
>;
這樣,您可以將其用作AppThunk
,而無需指定返回類型。
最后......使用AppThunk
的方式,我不認為它可以立即推斷出這里的返回類型,因為你告訴TS 這個 function 的類型是什么。
如果您的目標是為 thunk 參數提供通用類型,但允許操作創建者推斷其返回類型,您可以使用幫助程序 function 來實現:
export type AppThunk = ThunkAction<
unknown,
RootState,
unknown,
Action<string>
>;
export function enforceThunkType<T extends AppThunk>(thunk: T) {
return thunk;
};
// explicitly types dispatch
// while still infering the return type
export const loadCourse = (id: string) => {
return enforceThunkType((dispatch) => {
dispatch(loadCourseSuccess(undefined));
return api
.getCourse(id)
.then((course) => dispatch(loadCourseSuccess(course)));
});
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.