问询TypeScript因「避免添加表达式级语法」目标未新增的语法示例
一、因该目标未新增的表达式级语法示例
TypeScript团队严格遵循「不添加JavaScript中不存在的表达式级语法」这一目标,以下是几个明确被否决的具体案例:
管道运算符(Pipeline Operator):曾有提案建议引入
x |> f |> g这类链式调用的表达式语法,简化函数组合逻辑。但TypeScript团队认为这属于纯运行时的表达式语法扩展,且当时该提案在TC39处于极早期阶段,没有明确的标准化前景,因此拒绝引入,开发者只能通过函数嵌套(如g(f(x)))或第三方工具库实现类似能力。运行时模式匹配表达式:类似Rust、Scala中的
match表达式(如const result = match x { case 1 => "one"; case _ => "other" }),可直接作为表达式返回结果。TypeScript仅在类型系统中实现了模式匹配逻辑(如条件类型、类型推断中的模式),从未考虑在运行时表达式层面添加该语法,因为这属于JS没有的表达式扩展。非标准赋值/表达式语法糖:比如早期讨论过的激进赋值语法变体、表达式层面的类型断言扩展等,都因为属于表达式级语法创新而被否决,TypeScript只支持符合JS语义的表达式写法。
二、可选链与模板字面量类型是否属于相关情况?
这两个特性都不属于违反该设计目标的情况,原因如下:
可选链(
?.):虽然TypeScript先于JavaScript实现,但它从一开始就是基于TC39的标准化提案开发的,TypeScript团队只是提前落地了未来会成为JS正式语法的特性,而非独创表达式级语法。后续ES2020正式将可选链纳入标准,完全符合TypeScript「对齐JS演进」的思路,不属于自行添加非标准表达式语法。模板字面量类型:这是TypeScript类型系统层面的扩展,而非运行时表达式语法。JavaScript的模板字面量是运行时的字符串生成表达式(如
const str =${name} is ${age}),而TypeScript的模板字面量类型(如`type Greeting = `Hello ${string})仅在类型检查阶段生效,不会被编译为运行时代码,因此完全不涉及表达式级语法的新增,和该设计目标无关。
内容的提问来源于stack exchange,提问作者Qiulang

