prosource

도달 가능성 분석에서 Promise가 고려되지 않는 이유는 무엇입니까?

probook 2023. 6. 12. 21:33
반응형

도달 가능성 분석에서 Promise가 고려되지 않는 이유는 무엇입니까?

다음과 같은 기능이 있다고 가정합니다.

function returnNever(): never {
    throw new Error();
}

IIF를 생성할 때 다음 코드는 도달 불가능으로 표시됩니다.

(async () => {
    let b: string;
    let a0 = returnNever();
    b = ""; // Unreachable
    b.toUpperCase(); // Unreachable
})();

이것은 예상대로 작동합니다.참고:a0유형으로 추정됩니다.never.

하지만, 만약에returnNever()를 반환합니다.Promise<never>기다리고 있으면 행동이 달라집니다.

(async () => {
    let b: string;
    let a1 = await Promise.reject(); // returns Promise<never>
    b = ""; // Not unreachable?
    b.toUpperCase(); // Not unreachable?
})();

이 경우에는,a1또한 유형으로 추론됩니다.never하지만 이후 코드는 도달 불가능으로 표시되지 않습니다. 왜죠?

배경:최근에 우연히 몇 가지를 발견했습니다.logError다음 코드에서 처럼 보이는 함수.그것은 내부에서 사용되었습니다.catch블록. 이러한 방식으로 도달 가능성 분석이 아니라 확실한 할당 분석도 영향을 받는다는 것을 알게 되었습니다.

declare function fetchB(): Promise<string>;
async function logError(err: any): Promise<never> {
    await fetch("/foo/...");
    throw new Error(err);
}
(async () => {
    let b: string;
    try {
        b = await fetchB(); // Promise<string>
    } catch (err) {
        await logError(err); // awaiting Promise<never>
    }
    b.toUpperCase(); // Error: "b" is used before assignment
})();

한다면logError(모두 제거하여) 동기화됩니다.await모래땅async와 관련이 있는logError), 오류가 없습니다.또한, 만약let b: string로 변경됨let b: string | undefined,그undefined시도 차단 후 제거되지 않습니다.

고려하지 않을 이유가 있는 것 같습니다.awaitPromise<never>- 제어 흐름 분석의 모든 측면에서 기능을 제공합니다.버그일 수도 있지만, 저는 오히려 제가 여기서 세부 사항을 놓치고 있다고 생각합니다.

언급URL : https://stackoverflow.com/questions/58732814/why-is-promisenever-not-considered-in-reachability-analysis

반응형