web-dev-qa-db-ja.com

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から来ると、オブジェクトリテラルのようなものの真ん中のセミコロンが間違っているように見えます。

この決定は、パーサーのあいまいさを回避するために行われたのか、それとも他の理由で行われたのか?

42
Harold

TypeScript 1.6以降では、interface宣言または匿名オブジェクトタイプの区切り文字として,または;を使用できるようになりました。チームは、どちらか一方を使用する柔軟性が「古い回答」セクションにリストされた懸念を上回ると判断しました。

あいまいさをなくすために、クラス宣言で;を使用する必要があります。

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

私は歴史的な文脈のために以下の古い答えを保持しています


古い答え

技術的にはどちらの方法で行ってもかまいませんが、セミコロンを使用する理由はたくさんあります。

プログラミング言語では、の終わりを示すセミコロンとwithin行(列挙型のように、これにはいくつかの例外があります)。ほとんどのTypeScriptタイプは、複数の行にまたがるほど大きいので、セミコロンの方が適しています。

インターフェイスとクラスを同じように見せたいという要望もあります。このようなものを考えてみましょう:

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

同じ区切り文字を使用している場合は、コピーアンドペーストでMyPointPointを実装させるか、インターフェイスからクラスに、またはその逆に何かを変更する方がはるかに簡単です。おそらく、カンマをクラス宣言の区切り文字にすることができたかもしれませんが、それを行うために一般的に使用されている最初のプログラミング言語であることは困難です。

また、オブジェクトリテラルとタイプリテラルを一目で区別できることが望ましいです。単一メンバー{ x: string }は、コンテキストに依存する可能性がありますが、複雑な式でコンテキストが明確でない場合は、区切り文字に基づいて区別できる方がいいです。

最後に、interface構文で一般的に使用される他のすべての言語はセミコロンを使用します。疑問がある場合は、慣例に従ってください。型リテラルとインターフェイスの構文では、確実に同じ区切り文字を使用する必要があります。

68
Ryan Cavanaugh