網站搜尋

語法 - 為什麼 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);

現場演示