为什么 TypeScript TypeMemberList 中的分隔符是分号而不是逗号?

问题描述 投票:0回答:2

这是一个打字稿界面:

interface A {
    l: { x: string; y:number }
}

但这(类似的事情)会产生错误:

interface A {
    l: { x: string, y:number }
}

// => Error: ';' expected.

规范第 37 页: http://www.typescriptlang.org/Content/TypeScript%20Language%20Specification.pdf

我看到确实指定了

;
应该出现在那里,但来自 JavaScript 的对象文字中间的分号看起来是错误的。

做出这个决定是为了避免解析器中出现歧义,还是出于其他原因?

typescript grammar specifications
2个回答
112
投票

从 TypeScript 1.6 左右开始,您现在可以使用

,
;
作为
interface
声明或匿名对象类型中的分隔符!团队认为使用其中一种或另一种的灵活性超过了“旧答案”部分中列出的问题。

您仍然需要在类声明中使用

;
来消除歧义:

x = 3;
class X {
  // Could be parsed as expression with comma operator,
  // or two declarations
  y = 1, x = 3;
}

我保留了下面的旧答案以了解历史背景


旧答案

从技术上讲,这两种方式都可以,但有很多充分的理由使用分号。

在编程语言中,更常见的是用分号标记的末尾,并用逗号分隔行的内容(也有一些例外,例如枚举)。大多数 TypeScript 类型都足够大,可以跨越多行,这使得分号成为更好的选择。

还希望接口和类看起来相似。考虑这样的事情:

interface Point {
    x: number;
    y: number;
}
class MyPoint {
    x: number;
    y: number;
}

如果使用相同的分隔符,通过复制粘贴使

MyPoint
实现
Point
或将接口从接口更改为类或反之亦然会容易得多。可以说,您可以将逗号作为类声明中的分隔字符,但要成为第一种常用的编程语言来做到这一点是很难的。

还希望能够一目了然地区分对象文字和类型文字。虽然单成员

{ x: string }
可能取决于上下文,但当上下文在复杂表达式中不明显时,如果您可以根据分隔符来区分它们,那就更好了。

最后,常用的具有

interface
语法的所有其他语言都使用分号。如有疑问,请遵循约定,并且类型文字和接口的语法应该绝对使用相同的分隔字符。


0
投票

从 TypeScript 5.2.2 开始,您可以完全省略分隔符。这是正确的:

type Circle = {
    x: number  // look ma, no comma or semicolon or anything
    y: number
    r: number
}

const c: Circle = {
    x: 0,
    y: 0,
    r: 1
}

console.log(c);

现场演示

© www.soinside.com 2019 - 2024. All rights reserved.