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

标签 typescript grammar specifications

这是一个 typescript 界面:

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 的 object-literal-ish 中间的分号看起来是错误的。

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

最佳答案

从 TypeScript 1.6 左右开始,您现在可以使用 ; 作为 interface 声明或匿名对象类型中的分隔符!该团队认为,使用其中一种的灵 active 超过了“旧答案”部分中列出的问题。

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

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

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


旧答案

从技术上讲,它可以采用任何一种方式,但有很多充分的理由使用分号。

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

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

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

通过复制和粘贴使 MyPoint 实现 Point 更容易,或者将某些东西从接口(interface)更改为类,反之亦然,如果它们使用相同的定界符。可以说您可以将逗号作为类声明中的分隔符,但很难成为第一个常用的编程语言来做到这一点。

还希望能够一眼区分对象字面量和类型字面量。虽然单个成员 { x: string } 可能取决于上下文,但如果上下文在复杂表达式中不明显时,您可以根据它们的分隔符来区分它们会更好一些。

最后,与 interface 语法一起使用的所有其他语言都使用分号。如有疑问,请遵循约定,类型字面量和接口(interface)的语法应该绝对使用相同的定界字符。

关于typescript - 为什么 TypeScript TypeMemberList 中的分隔符是分号而不是逗号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27994253/

相关文章:

c - YACC语法减少/减少冲突

haskell - 乔姆斯基层次结构中类型类和语法级别之间的对应关系

grammar - 上下文相关语法可以有空字符串吗?

html - 为什么 DOM 不阻止将 <div> 附加到 <p> 元素中?

c - C 中结构体自赋值是否安全?特别是如果一侧是指向结构的指针?

typescript - 在 typescript 中过滤keyof类型参数

angular - 自定义每个文件夹的 TypeScript 编译器选项

javascript - 语法错误: Unexpected token { when trying to run protractor test

c# - C# 是否强制 `unmanaged` 类型为 "blittable"?

angular - 如何解决 angular2 应用程序中的 'trailing whitespace' 错误?