개발자

타입스크립트에서 비동기 함수 리턴값을 정의하려고 하는데 undefined 라서 타입 오류가 발생합니다.

2023년 05월 04일조회 347

타입스크립트를 사용하고 있는데, 비동기 함수 호출 후 반환되는 데이터의 타입을 어떻게 정의하고, 이를 setState 함수를 사용할 때 어떻게 처리해야 할지 궁금합니다. 현재 코드에서는 데이터를 받아오는 부분에서 undefined가 반환될 가능성이 있어서, setState(data) 부분에서 타입 관련 에러가 발생하는데, 이 문제를 해결하려면 어떻게 해야 할까요? (1) 번에서 undefined일 가능성이 존재해서 최종적으로 setState(data)이 타입걸리는거 같은데 이럴땐 Undefined를 일일히 전부 명시해줘야 하는 걸까요?

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 2

이승현님의 프로필 사진

일단 1번에서 response가 undefined가 온다고 생각하고, response.data.foo 는 FooType, response.data.bar 는 BarType이라고 하면, (그리고, 되도록 props도 type 이 있는게 좋을 듯 하군요.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
type Props = FetchRequestType;
type DataType = {
	a: FooType;
	b: BarType;
} | undefined;

function MyComponent(props: Props) {
	const [data, setData] = useState<DataType>();
	const onFetchData = useCallback(async () => {
		const response = await fetchData(props); // 1.
		if (response) {
			const data = { a: response.data.foo, b: response.data.bar }; // 2.
			setData(data);
		} else {
			setData(undefined);	
		}
	}, [props]);

	useEffect(() => {
		onFetchData();
	}, [onFetchData]);
}
커리어리 AI 봇님의 프로필 사진

안녕하세요! 타입스크립트에서 비동기 함수의 반환 타입을 정의하는 방법에 대해 답변해드리겠습니다. 먼저, undefined가 반환될 가능성이 있는 경우에는 해당 타입을 Optional하게 정의해야 합니다. 이를 위해서는 반환 타입 끝에 "?"를 붙이면 됩니다. 1. 예를 들어, Promise를 반환하는 함수의 반환 타입을 정의하려면 다음과 같이 작성할 수 있습니다. 2. 여기서 MyDataType는 반환될 데이터의 타입을 나타내는 인터페이스 혹은 타입 별칭입니다. 만약 반환되는 데이터의 타입이 없다면 undefined를 포함한 유니언 타입으로 정의하면 됩니다. 그리고, 아래 코드에서 setState(data) 부분에서 타입 관련 에러가 발생하는 경우에는 useState의 제네릭 타입으로 데이터 타입을 명시해주면 됩니다. 예를 들어, MyDataType이라는 인터페이스가 있다면 다음과 같이 작성할 수 있습니다. 3. 이렇게 하면 data 변수는 MyDataType 혹은 undefined 중 하나의 값만 가질 수 있습니다. 따라서 setState(data) 부분에서 타입 관련 에러가 발생하지 않게 됩니다. 마지막으로, useCallback 함수에서 onFetchData 함수를 정의할 때, 반환 타입도 함께 명시해주면 더욱 타입 안정성을 높일 수 있습니다. 예를 들어, 다음과 같이 작성할 수 있습니다. 이렇게 하면 onFetchData 함수가 Promise<void>를 반환하는 것으로 정의되며, 반환 타입이 명시되어 있으므로 타입 관련 에러를 미리 방지할 수 있습니다. 이상으로, 비동기 함수의 반환 타입을 정의하는 방법과 useState 제네릭 타입을 활용하여 타입 안정성을 높이는 방법에 대해 설명해드렸습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#1
async function myAsyncFunction(): Promise<MyDataType | undefined> {
  // 비동기 작업 수행 후 MyDataType 혹은 undefined 반환
}


#2
const [data, setData] = useState<MyDataType | undefined>();

#3
const onFetchData = useCallback(async (): Promise<void> => {
  const response = await fetchData(props);
  const data = { a: response.data.foo, b: response.data.bar };

  setData(data);
}, [props]);

커리어리 AI 봇의 답변을 평가해 주세요!

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!