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

Har*_*old 34 grammar specifications typescript

这是一个打字稿界面:

interface A {
    l: { x: string; y:number }
}
Run Code Online (Sandbox Code Playgroud)

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

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

// => Error: ';' expected.
Run Code Online (Sandbox Code Playgroud)

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

我看到确实指出a ;应该出现在那里,但是来自JavaScript的对象 - 文字中间的分号看起来是错误的.

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

Rya*_*ugh 61

从TypeScript 1.6开始,您现在可以在声明或匿名对象类型中使用,;作为分隔符使用interface!该团队认为,使用其中一个或另一个的灵活性超过了"旧答案"部分中列出的问题.

您仍然需要;在类声明中使用以消除歧义:

x = 3;
class X {
  // Could be parsed as expression with comma operator,
  // or two declarations
  y = 1, x = 3;
}
Run Code Online (Sandbox Code Playgroud)

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


老答案

从技术上讲,它可能已经走了两条道路,但有很多强有力的理由使用分号.

在编程语言,它更经常可以看到分号标志着两端线和逗号分隔的事情的线(也有少数例外,如枚举).大多数TypeScript类型都足够大,它们跨越多行,这使得分号成为更好的选择.

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

interface Point {
    x: number;
    y: number;
}
class MyPoint {
    x: number;
    y: number;
}
Run Code Online (Sandbox Code Playgroud)

如果它们使用相同的分隔符,则通过复制和粘贴来实现MyPoint工具要容易得多Point,或者将某些东西从接口更改为类,反之亦然.可以说你可以让逗号成为类声明中的分隔符,但是成为第一种常用的编程语言是很难的.

能够一目了然地告诉对象文字和文字类型也是可取的.虽然单个成员{ x: string }可能要么依赖于上下文,但如果在复杂表达式中上下文不明显时您可以根据它们的分隔符区分它们,那么它会更好一些.

最后,与interface语法共同使用的每种其他语言都使用分号.如果有疑问,请遵循约定,类型文字和接口的语法肯定应使用相同的分隔字符.

  • 老实说,不要指望这样的问题.但答案使其真正有用.好像你知道你在做什么Ryan ...;) (3认同)