반응형
도달 가능성 분석에서 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
시도 차단 후 제거되지 않습니다.
고려하지 않을 이유가 있는 것 같습니다.await
의Promise<never>
- 제어 흐름 분석의 모든 측면에서 기능을 제공합니다.버그일 수도 있지만, 저는 오히려 제가 여기서 세부 사항을 놓치고 있다고 생각합니다.
언급URL : https://stackoverflow.com/questions/58732814/why-is-promisenever-not-considered-in-reachability-analysis
반응형
'prosource' 카테고리의 다른 글
iPad Safari 스크롤로 HTML 요소가 사라졌다가 다시 나타나면서 지연됨 (0) | 2023.06.12 |
---|---|
R에 지정된 열 이름으로 빈 데이터 프레임을 만드는 방법은 무엇입니까? (0) | 2023.06.12 |
Java EE Framework 중 Oracle ADF 11g의 위치는 무엇입니까? (0) | 2023.06.12 |
R을 사용하여 최대값이 포함된 행 색인 찾기 (0) | 2023.06.12 |
다른 실행 파일이 필요한 에 실행 파일을 연결할 때 ld가 -rpath-link가 필요한 이유는 무엇입니까? (0) | 2023.06.07 |