Подтвердить что ты не робот

Почему разделитель в точке с запятой 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

Я вижу, что действительно указано, что там должен присутствовать a ;, но, исходя из JavaScript, точка с запятой в середине объекта object-literal-ish выглядит неправильно.

Было ли принято это решение, чтобы избежать двусмысленности в синтаксическом анализаторе или по какой-то другой причине?

4b9b3361

Ответ 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 с помощью copy-and-paste или изменить что-то из интерфейса в класс или наоборот, если они используют один и тот же разделитель. Возможно, вы могли бы сделать запятыми разделительным символом в объявлениях классов, но это трудно продавать, чтобы быть первым языком программирования, используемым для этого.

Также желательно иметь возможность рассказать объектные литералы и разбить литералы на первый взгляд. Хотя одночастный { x: string } может быть либо в зависимости от контекста, он несколько приятнее, если вы можете отличить их на основе их разделителя, когда контекст не является очевидным в сложном выражении.

Наконец, каждый другой язык, используемый совместно с синтаксисом interface, использует точки с запятой. Если вы сомневаетесь, следуйте соглашению, а синтаксис для литерала типа и интерфейса обязательно должен использовать один и тот же разделительный символ.