打字稿2 - 在三元/条件运算符表达式中抛出

时间:2016-11-13 11:53:04

标签: exception typescript conditional-operator

我尝试编译:

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

...并在throw - expression expected上收到错误消息。我可以使用在适当位置调用的内联方法来解决这个问题,但这看起来不太好。 ((() => {throw Error("bad things"})()

为什么不投入三元运算符的分支?或者是否有其他语法可行,也许是我缺少的编译选项?

在解决方法中,((() => throw Error("bad things")()),在函数体中没有花括号的投掷似乎不起作用。

3 个答案:

答案 0 :(得分:1)

这是构造了多少种语言,你有语句和表达。在这种情况下,您要为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";

如果这真的是你想要做的。这将更具可读性:

//...

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

const x: string = "hello";

//...

答案 1 :(得分:1)

这是语言的语法怪癖。

语句throw ex可以被视为具有never类型的表达式,因为never是不返回的函数类型,这正是当你发生的时候发生的事情throw。在许多语言中bottom typenever的技术术语 - 它不仅仅是一个“奇怪的关键字”)。

语句throw ex与语句for (let x of ...)不同,因为后者无法理解返回任何内容,而throw ex可以理解为返回never

答案 2 :(得分:1)

这仍然是一个未解决的问题。

https://github.com/microsoft/TypeScript/issues/18535

基于此问题,直到ECMA TC39得出结论之前,才开始实施。