語法 - 為什麼 TypeScript 的 TypeMemberList 中的分隔符是分號而不是逗號?
這是一個 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 來看,這個出現在類似物件字面量中間的分號看起來不對。
這個決定是為了避免解析器中的歧義而做的,還是出於其他原因?
答案#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 語法的語言都使用分號。當有疑問時,遵循慣例,而型別字面量和介面的語法應該 絕對 使用相同的分隔字符。
答案#2
從 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);
現場演示
