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

2024-01-11

这是一个打字稿界面:

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 http://www.typescriptlang.org/Content/TypeScript%20Language%20Specification.pdf

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

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


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

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

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

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


旧答案

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

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

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

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

制作起来容易多了MyPoint实施Point通过复制和粘贴,或者将某些内容从接口更改为类,反之亦然,如果它们使用相同的分隔符。可以说,您可以将逗号作为类声明中的分隔字符,但要成为第一个这样做的常用编程语言却很难。

我们还希望能够一目了然地区分对象文字和类型文字。虽然是单人成员{ x: string }可以取决于上下文,当上下文在复杂表达式中不明显时,如果您可以根据分隔符区分它们,那就更好了。

最后,常用的所有其他语言interface语法使用分号。如有疑问,请遵循约定,类型文字和接口的语法应该确实使用相同的分隔字符。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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