이것은 얼마나 많은 언어가 구성되어 있으며 명령문과 표현식을 가지고 있습니다. 이 경우 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";
//...
좋은 대답, 나는 당신과 동의합니다. 언어에'never'를 도입함으로써, throw하는 함수의 반환 유형으로 - throw는'never'를 반환하는 표현식이라고 가정하는 것이 자연 스럽습니다. –
나는 강력하게 동의하지 않는다. 'throw '는'for'와 같이 증가하지 않거나'while (true)'와 같은 명령문이며 해당 명령문의 리턴 유형은 서브 루틴 호출의 컨텍스트에서만 의미가 있습니다. 문'throw Error()'는 단순히 표현식이 아니며 *는 결코 '결코'가 아닌 어떤 유형도 가지지 않습니다. ** 해당 진술을 포함하는 서브 루틴 ** 또는 절대로 반환하지 않는 다른 논리에 대한 호출은 표현식이며 유형은 '절대로'입니다. – Alex
@ JørgenTvedt 표현식은 문장에 * 무언가를해야하는 반면 * 표현식은 * 값을 평가합니다. 나는'throw '를 값으로 갖는 것을 보는데 많은 감각을 느끼지 못하지만, 코드 실행의 경로를 바꾸는 무언가를 할 때 훨씬 더 의미가 있습니다. 'var x = while (true) {}'또는'var x = if (x == y) {...}'에있는 것처럼'var x = throw Error()'에 많은 감각이 있습니다. – Alex