리덕스 사가 구현 중 마주친 yield call 타입 에러가 나왔다.
'yield' expression implicitly results in an 'any' type because its containing generator lacks a return-type annotation.
call()에 사용할 api 메소드 타입도 모두 설정한 상태인데 ....왜?
export async function getMoviesAPI() {
const { results }: { results: IMovie[] } = await (await fetch(URL)).json();
console.log("api", results);
return results;
}
function* getMoviesSaga(action: any) {
try {
//에러는 여기서 난다.
const data = yield call<typeof getMoviesAPI>(getMoviesAPI);
yield put(getMoviesSuccess(data));
} catch (error) {
yield put(getMoviesError(error));
}
}
function* moviesSaga() {
yield takeEvery(GET_MOVIES, getMoviesSaga);
}
검색을 해보았다.
링크텍스트
stackOverflow 답변을 간단히 요약하자면
yield 왼쪽에 변수값의 타입은 항상 any
yield 는 모든값을 대응해야 하므로 타입을 반환하지 않음.
yield 로 산출되는 값의 타입은 사용자가 정의해야함.
고로 다음과 같이 타입을 직접 입력해준다.
call 함수에 제네릭 설정도 삭제한다. 무용지물
const data : IMovie[] = yield call(getMoviesAPI);
getMoviesAPI 리턴값이 변경될 경우 같이 수정되어야 하므로 ... 귀찮으니까 ReturnType로 설정해둔다.
const data : ReturnType<typeof getMovieAPI> = yield call(getMoviesAPI);
2022.02.03 data 타입이 Promise< IMovie[] > 로 설정된다.
==> 흠... Promise<>형태의 리턴타입을 실제 타입으로 받을 방법을 찾아봐야 겟다.