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

时间:2015-01-16 23:10:16

标签: typescript grammar specifications

这是打字稿界面:

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的对象 - 文字中间的分号看起来是错误的。

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

1 个答案:

答案 0 :(得分:49)

从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语法的所有其他常用语言都使用分号。如果有疑问,请遵循约定,类型文字和界面的语法肯定使用相同的分隔符。