这是一个 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/