2016-11-13 2 views
0

にthrow'ing: - expression expected活字体2 - 私がコンパイルしようとする条件付き/三項演算子式

const value = "20" 
const x : string | never = "10" === value ? throw Error("bad things") : "hello" 

を...とthrowにエラーが発生します。私はインラインメソッドを使用してこれを解決できますが、それはうまく見えません。 ((() => {throw Error("bad things"})()

なぜ3値演算子の枝を投げても問題ないのですか?あるいは、私が行方不明のオプションをコンパイルするための別の構文がありますか?

関数本体に中括弧を入れないでスローが機能しないように見えますが、回避策では((() => throw Error("bad things")())です。

答えて

0

これは構文上の特徴です。 neverが起こるまさにである、返さない関数の種類があるので

声明throw exは、タイプneverを持つ式とみなすことができるときthrowbottom type(多くの言語では、neverの技術用語 - 単に「奇妙なキーワード」ではない) throw exneverを返すように理解することができるのに対し、後者は、何かを返すように理解することができないので

ステートメントthrow exfor (let x of ...)、例えば、異なります。

+0

丁寧に回答します。言語に 'never'を導入すると、スローする関数の戻り値の型として - スローを仮定するのは当然のことですが、' never'を返す式です。 –

+0

私は強く反対します。 'throw'はインクリメントしない' for'のような文であり、 'while(true)'であり、これらの文の戻り値の型はサブルーチン呼び出しの文脈でのみ意味を持ちます。 'throw Error()'という文は単純に*式ではなく、*は決して 'never'ではない型を持ちます。 **そのステートメントを含むサブルーチンへの呼び出し、または決して返されない他のロジックは、式であり、タイプは「決して」ではありません。 – Alex

+0

@JørgenTvedt式は*を*評価するものですが、ステートメントは何かを行うことになっています。私は値を持つものとして 'スロー 'を見ようとするのはあまり意味がありませんが、コード実行のパスを変更する何かをする際にははるかに意味があります。 '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キーワードは、制御フロー分析に接続された奇妙なタイプです。これは本当にあなたが何をしたいかである場合

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

:あなたはすぐに呼び出された関数式をしたくないので、もしそれはあなただけで、通常の関数を使用することができ、あなたがsuddently式として文を処理することはできません。これははるかに読みやすくなります:

//... 

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

const x: string = "hello"; 

//...