Когда использовать точку с запятой в TypeScript?

Я знаю, что JavaScript (и, следовательно, TypeScript) во многих случаях поддерживают пропуск точек с запятой. Тем не менее я хочу добавить точки с запятой, чтобы быть однозначным, как это предлагается в TypeScript Глубокое Погружение

однако я не могу найти руководство, в котором перечислены, где использовать точку с запятой. Например, посмотрите на следующий код

class Person {
  private name: string; // A

  constructor(name: string) {
    this.name = name;
  }; // B

  public add = () => {
    return "C";
  }; // C
}; // D

Я уверен, что использовать точку с запятой в A. Но как насчет B, C, D а все остальные случаи, не охваченные моим примером?

редактировать: я должен добавить, что я не спрашиваю, где опустить точку с запятой, но где их добавить. Ответ типа всегда не выполняет мои потребности, так как я не могу добавить ; после public. Я хочу знать, где именно поставить точку с запятой.

4 ответов


просто префиксные строки, начинающиеся с [, (, или точкой с запятой, и вы (почти) золотой*

используя тот же пример, что и другой ответ:

var x = { xx : "hello", yy : "world"}
(function () {
    console.log("Hello World");
})();

добавляем точку с запятой согласно этому правилу:

var x = { xx : "hello", yy : "world"}
;(function () {

в противном случае javascript думает, что мы пытаемся call( какая-то функция, или reference[ некоторый массив. Это проще, легче следовать, и это визуально легче заметить. Вам также нужны точки с запятой в for петли, но .forEach метод - это чище и проще способ. Я бы с уверенностью сказал, что это правило охватывает 99% сценариев, которые вам нужно использовать точку с запятой в javascript / typescript.

следуя этому методу, важно связать новую строку с завершением оператора.

*это возвращает маститых undefined:

  return 
          7

после возврата появляется новая строка, и браузер вставляет точку с запятой, завершая оператор как это:

  return; // this will return undefined.
          7

вместо этого:

  return (
          7
  )

Javascript на самом деле довольно умный с точками с запятой, есть открытый paren, поэтому точка с запятой не вставляется, пока не будет найден закрывающий paren.

если у вас есть привычка ставить точки с запятой везде и не знать точно, когда они нужны, вы можете прочитать это для объяснения длиной в несколько страниц: http://blog.izs.me/post/2353458699/an-open-letter-to-javascript-leaders-regarding

я признаю, что большинство людей по-прежнему будут просто засорять полу двоеточия в конце каждой строки, но если вы новичок и только учитесь, это лучший подход.


TL; DR: всегда

помните: лучше перебдеть, чем недобдеть

вы, вероятно, должны размещать их все время. Вы не нужно разместить их для того, чтобы TypeScript работал, но вы избежите ошибок, сделав это. ASI (автоматическая вставка точки с запятой) работает довольно хорошо большую часть времени, но не всегда. Вы действительно хотите столкнуться с проблемой только потому, что вы не поставили точку с запятой, и вы продолжаете игнорировать ошибку? (В зависимости от вашего IDE, ошибка может быть действительно поймана). Но считайте это вполне допустимым Javascript.

 var x = { xx : "hello", yy : "world"}
 (function () {
     console.log("Hello World");
 })();

это допустимый javascript (и таким образом действительный typescript). Этот код фактически выдаст ошибку. Uncaught TypeError: (intermediate value)(intermediate value) is not a function(…).

которых можно было бы избежать, просто поставив точку с запятой после первой строки. Вам это не нужно, и если бы следующая строка не была этой функциональной строкой, она, вероятно, работала бы правильно. Но ты хочешь рискнуть? Это похоже на риск. за ошибки над одним лишним персонажем мне это не стоит. Кроме того, через некоторое время вы просто привыкнете размещать точки с запятой в конце строки;

подумайте о своих коллегах

еще одна причина, по которой вы можете использовать их все время, - это изменение кода. Ваш коллега может изменить ваш код - и при этом думает, что ASI будет продолжать работать даже с его изменением кода. Представьте, что это не так, и что его изменение на самом деле делает ASI сделай что-нибудь не так. Это действительно стоит головной боли для вашего коллеги? Если он достаточно изменяет ваш код, а затем внезапно сталкивается с множеством ошибок, он может быть довольно смущен, если он не знает точного способа работы ASI. Вы можете сэкономить потенциальному коллеге довольно много (ненужной) работы, просто поместив их повсюду.


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

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

for(int i = 0; i

существует одна ситуация, когда ваше намерение может быть неоднозначным, с необычным стилем начала строки с ( или [ символ, так как новая строка не завершает оператор в этом случае. В подавляющем большинстве случаев это именно то, что вы хотите, это очевидно, когда это не так, и вы можете придумать некоторые утверждения с точкой с запятой или без (как я показал выше), которые являются проблематичными.

Я не собираюсь говорить, что иррационально использовать точки с запятой, потому что это так укоренилось в культуре, но, Пожалуйста, игнорируйте иррациональный страх, который многие пытаются поддержать запутанная и неточная дискуссия об АСИ или безумном махании рукой. Это чистая догма, друзья.


как некоторые другие современные языки производный от синтаксиса C,синтаксис JavaScript был разработан чтобы вы могли опустить точки с запятой почти во всех ситуациях. Я бы сказал, использовать их всегда или использовать их никогда*. Чтобы использовать их "никогда", длинный и короткий из них-это каждое утверждение идет по новой строке и никогда не начинает строку с (, [ или `.

однако, чтобы использовать их "никогда", вы определенно должны использовать линтер такой as Стандартный Стиль JavaScript или eslint встроенный полу правило который будет убедиться, что вы избегаете нескольких gotchas, таких как следующее:

a = b + c
(d + e).foo()

вышеизложенное интерпретируется как a = b + c(d + e).foo(); обратите внимание, что, следуя приведенному выше правилу и не начинать строку с ( эта ситуация предотвращена.

Другой распространенный пример:

return
{
     hello: "world"
};

С первого взгляда можно подумать, что это будет интерпретироваться как возвращение объект, но он фактически интерпретируется как return; и код для определения объекта после оператора return недоступен. Опять же, следуя правилу не начинать строку с { этого можно избежать.


  • *Ладно, ладно, не никогда, но почти никогда.