프로그래밍풀스택 개발자

타입스크립트에서 비동기 함수와 Promise의 타입화는 어떻게 작동합니까? 반환 값을 안전하게 설명하고, 타입 오류를 잡는 방법, 일반 함수와의 차별점은 무엇입니까? 예를 들어 설명하십시오.

Hintsage AI 어시스턴트로 면접 통과

답변.

타입스크립트에서 비동기 함수(async/await)는 항상 Promise를 반환합니다. 반환 값의 타입은 다음과 같이 지정됩니다: Promise<Type>. 함수 설명시 결과를 명시적으로 타입화하는 것이 중요하여 타입스크립트가 프로미스 내부의 타입과 올바르게 작동하도록 합니다. 중간 값이 선언된 값과 일치하지 않을 경우 타입 오류가 발생할 수 있습니다.

비동기 함수:

async function fetchUser(id: number): Promise<User> { const response = await fetch(`/api/user/${id}`); const data: User = await response.json(); return data; }

함수가 오류 또는 거부를 반환해야 하는 경우 프로미스의 타입은 오류를 직접 설명해서는 안 됩니다(Promise<Error>). 거부된 프로미스는 타입화되지 않으며 catch를 통해 잡힙니다.

프로미스 체인의 타입화가 중요합니다:

function getNumber(): Promise<number> { return Promise.resolve(42); } getNumber().then(val => val.toFixed(2)); // 타입스크립트는 val이 숫자임을 알고 있습니다.

함정 질문입니다.

질문: 비동기 함수가 프로미스를 제외한 다른 것을 반환할 수 있습니까?

답변: 아닙니다. 비동기 함수는 항상 Promise 객체를 반환합니다. 명시적으로 프로미스가 아닌 값을 반환하면 타입스크립트는 반환된 값을 자동으로 프로미스에 감쌉니다.

async function test() { return 1; } const result = test(); type ResultType = typeof result; // Promise<number>

주제에 대한 미세한 차이로 발생한 실제 오류 사례들.


이야기

개발자는 반환 값의 명시적인 타입화 없이 함수를 작성했습니다. 특정 타입의 객체를 반환한다고 가정했습니다. 로직이 변경되면서 다른 타입을 반환하게 되었고, 타입스크립트는 타입 추론에 기반하여 오류를 발생시키지 않았습니다. 결과적으로 오류는 런타임에서만 나타났으며 함수 소비자가 존재하지 않는 속성을 호출하려고 할 때 드러났습니다.


이야기

한 프로젝트에서 프로미스 체인이 타입화되지 않았습니다. 결과에서 존재하지 않는 메소드를 호출하려고 하면 오류가 발생했습니다. 그래서 then(response => response.data)의 결과는 any로 처리되었고, 필드나 메소드의 오류는 오로지 런타임에서만 나타났습니다. 오류는 프로덕션으로 넘어갔고 사용자들에 의해 발견되었습니다.


이야기

비동기 함수를 Promise<Error> 타입으로 선언했는데, 이는 오류를 잡을 수 있을 거라고 생각했지만 실제로 오류는 throw를 통해 전파되지 않았고 프로미스는 다른 타입의 값으로 거부되었습니다. 이것은 오류와 유효한 값들이 암묵적으로 섞이게 되었고 프로미스 결과 처리에서 버그가 발생하게 되었습니다.