【问题标题】:Why is the separator in a TypeScript TypeMemberList semicolon as opposed to comma?为什么 TypeScript TypeMemberList 中的分隔符是分号而不是逗号?
【发布时间】:2015-03-15 15:58:18
【问题描述】:

这是一个打字稿界面:

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 grammar specifications


    【解决方案1】:

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

    【讨论】:

    • 老实说,不会想到这样的问题。但答案使它非常有用。看起来你知道你在做什么瑞恩...... ;)
    • @Ryan Cavanaugh - 感谢您的这些想法。你为 MS 工作的 TypeScript 吗?
    • 是的。我不是为了这个特别的决定而在场的,但是在研究这门语言的过程中,我学到了很多关于这些事情的知识。
    • @RyanCavanaugh 这似乎最近已更改为接受分号或逗号。 goo.gl/5fCp2R这是什么时候改变的?你能更新你的答案吗? :)
    • 终于有时间更新这个
    猜你喜欢
    • 2017-11-23
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 2016-07-01
    • 2015-10-15
    • 1970-01-01
    相关资源
    最近更新 更多