我尝试编译:
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")()
),在函数体中没有花括号的投掷似乎不起作用。
答案 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 type(never
的技术术语 - 它不仅仅是一个“奇怪的关键字”)。
语句throw ex
与语句for (let x of ...)
不同,因为后者无法理解返回任何内容,而throw ex
可以理解为返回never
答案 2 :(得分:1)