2016-11-13 3 views
0

에서 throw'ing 나는 컴파일하려고합니다. 장소에서 호출 된 인라인 메서드를 사용하여이 문제를 해결할 수 있지만 좋지 않습니다. ((() => {throw Error("bad things"})())타이프 라이터 2 원/조건 연산자 표현

3 진수 연산자의 분기를 던지지 않는 이유는 무엇입니까? 아니면 작동하지 않는 다른 구문이 있습니까? 아마도 누락 된 옵션을 컴파일할까요?

함수 본문에 중괄호를 쓰지 않고서도 throw가 작동하지 않는 것 같습니다 ((() => throw Error("bad things")()).

답변

0

이것은 언어의 통어론입니다. never 일이 정확히 무엇 인 반환하지 않는 함수의 유형이기 때문에

throw ex는 유형 never이있는 표현으로 간주 될 수 때 throw. bottom type (많은 언어로는 never의 기술 용어 - 단순히 "이상한 키워드"가 아닙니다.)

throw exthrow exnever를 반환하는 것으로 이해 될 수있는 반면, 예를 들어, 후자는 알 수 없으므로 명령문 for (let x of ...)는 아무것도 반환 다릅니다 문.

+0

좋은 대답, 나는 당신과 동의합니다. 언어에'never'를 도입함으로써, throw하는 함수의 반환 유형으로 - throw는'never'를 반환하는 표현식이라고 가정하는 것이 자연 스럽습니다. –

+0

나는 강력하게 동의하지 않는다. 'throw '는'for'와 같이 증가하지 않거나'while (true)'와 같은 명령문이며 해당 명령문의 리턴 유형은 서브 루틴 호출의 컨텍스트에서만 의미가 있습니다. 문'throw Error()'는 단순히 표현식이 아니며 *는 결코 '결코'가 아닌 어떤 유형도 가지지 않습니다. ** 해당 진술을 포함하는 서브 루틴 ** 또는 절대로 반환하지 않는 다른 논리에 대한 호출은 표현식이며 유형은 '절대로'입니다. – Alex

+0

@ JørgenTvedt 표현식은 문장에 * 무언가를해야하는 반면 * 표현식은 * 값을 평가합니다. 나는'throw '를 값으로 갖는 것을 보는데 많은 감각을 느끼지 못하지만, 코드 실행의 경로를 바꾸는 무언가를 할 때 훨씬 더 의미가 있습니다. 'var x = while (true) {}'또는'var x = if (x == y) {...}'에있는 것처럼'var x = throw Error()'에 많은 감각이 있습니다. – Alex

0

이것은 얼마나 많은 언어가 구성되어 있으며 명령문과 표현식을 가지고 있습니다. 이 경우 x에 값을 할당하고 있지만 오류를 발생시키는 것은 값/표현식이 아니므로 명령문/연산입니다.

당신은 같은 것을 쓰기하지 못할 이유는 바로 같은 이유로이 작업을 수행 할 수 없습니다

const x : string | never = "10" === value ? for(var i in myArray) { /* do stuff */ } : "hello". 

당신이 자기를 사용하여 주위에 "해킹"할 수 있습니다 경우에도 그것은, 언어의 규칙에 대해 단순히의를 이론적으로 평가되고 표현 인 평가 함수.

진술과 표현에 대한 더 자세한 설명은 this question을 확인하십시오.

TS의 never -keyword는 제어 흐름 분석에 연결된 홀수 유형입니다. 그것은 당신이 suddently 표정으로 문을 처리 할 수 ​​없습니다, 그래서 당신은 당신의 즉시 호출 함수 표현식을 원하지 않는 경우, 당신은 단지 일반 기능을 사용할 수 있습니다 : 이것은 정말 당신이 무엇을 원하는 경우

const value = "20" 
var thrower =() => { throw Error("bad things"); } 
const x: string | never = "10" === value ? thrower() : "hello"; 

합니다. 이것은 훨씬 더 읽기 쉬울 것입니다 :

//... 

if(value !== "10") 
    throw Error("bad things"); 

const x: string = "hello"; 

//...