这是一个打字稿界面:
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 的对象文字中间的分号看起来是错误的。
做出这个决定是为了避免解析器中出现歧义,还是出于其他原因?
从 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
语法的所有其他语言都使用分号。如有疑问,请遵循约定,并且类型文字和接口的语法应该绝对使用相同的分隔字符。
从 TypeScript 5.2.2 开始,您可以完全省略分隔符。这是正确的:
type Circle = {
x: number // look ma, no comma or semicolon or anything
y: number
r: number
}
const c: Circle = {
x: 0,
y: 0,
r: 1
}
console.log(c);