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

Правила использования угловых скобок в Typescript

Каковы общие правила, которые определяют, когда, где, как и почему угловые скобки, т.е. "<...>", должны использоваться в TypeScript?

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

У меня есть разумное понимание основ TypeScript: В общем, я изучил обучающие материалы по TypeScript домашним страницам, перешел на значительную часть спецификации TypeScript, прочитал "Окончательное руководство TypeScript", веб-сайт и следуют учебному руководству "Освоение TypeScript". В этой конкретной теме я также искал Google и StackOverflow.

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

UPDATE:

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

Позвольте мне проиллюстрировать мою просьбу, представив пример того, что я знаю общие правила для: фигурных скобок в ванильном JavaScript. Кудрявые скобки всегда имеют пару открывающей и закрывающей скоб, которые окружают сущность. Эта сущность может быть одной из двух основных вещей.

Во-первых, фигурные скобки могут окружать группировку операторов в:

  • тело функции, метода, конструктора или генератора,

  • тело an if statement/clause или else,

  • тело цикла for, for/of, for/in, while или do/while,

  • тело блока try, catch или finally или

  • анонимный блок операторов.

Во-вторых, фигурные скобки также могут окружать список:

  • свойства объектного литерала,

  • конструкторы, свойства и/или методы объявления class,

  • функции и/или константы должны быть export ed или import из модуля,

  • case следуя критерию switch, или

  • enum с.

(Является ли этот список полным и/или правильным, не является точкой.)

Теперь представьте, что кто-то изучает JavaScript. До сих пор она, возможно, правильно научилась использовать фигурные скобки, чтобы окружить блок утверждений, т.е. Использования в первом наборе пунктов выше. Тем не менее, она может иногда сталкиваться с фигурными скобками вокруг вещей, которые не являются блоком утверждений, например. {a:1, b:2} и были смущены, потому что содержимое этих фигурных скобок не является оператором, который может быть выполнен. Или, что еще хуже, она даже не может указать на пример, который она не понимает. Вместо этого у нее просто есть это грызущее чувство в ее голове, что код, с которым она столкнулась, написанная другими людьми, содержит фигурные скобки, используемые незнакомыми способами (хотя она не может запомнить, где). Это заставляет ее подозревать, что ее нынешнее понимание того, когда использовать фигурные скобки, может быть неполным. Вместо того, чтобы пытаться найти отдельные примеры, которые она не понимает, она просто хочет, чтобы кто-то дал ей вышеупомянутый список "правил" того, где использовать фигурные скобки.

Итак, опять мой вопрос заключается в следующем: может ли кто-нибудь описать для меня некоторые общие принципы и/или конкретные правила, которые исчерпывающе описывают использование угловых скобок в TypeScript способом, которым я описал использование фигурных скобок в JavaScript выше?

4b9b3361

Ответ 1

С такими вопросами я бы рекомендовал прочитать спецификацию, особенно раздел Грамматика. Синтаксис типа < something > используется в

  • Параметры параметров

    • Определено как < TypeParameterList > в разделе 3.6.1
    • Используется с объявлениями и сигнатурами вызовов классов, интерфейсов, функций и т.д.

      function heat<T>(food: T): T { return food; }
                //^^^^^ Type parameter list
      
      class Pizza<T, E extends Cheese> { toppingA: T; toppingB: E }
               //^^^^^^^^^^^^^^^^^^^^ Type parameter list
      
  • Аргументы типа

    • Определено как < TypeArgumentList > в разделе 3.6.2
    • Используется со ссылками на общие типы и вызовы для общих функций

      var pizza: Pizza<Pepperoni, Mozzarella>;
                     //^^^^^^^^^^^^^^^^^^^^^^ Type argument list
      pizza = heat<{ toppingA: Pepperoni, toppingB: Mozzarella}>(ingredients) 
                 //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Type argument list
      
  • Утверждения типа

  • JSX-выражения (если включено)

    • Не указано в спецификации, но следует следовать синтаксису JSX, который в основном является выражением типа

      <JSXElementName JSXAttributes(optional)> JSXChildren(optional) </JSXElementName>
      

      или

      <JSXElementName JSXAttributes(optional) />
      

Ответ 2

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

  • В качестве устаревшего синтаксиса для утверждений типа
  • Для ручного указания параметров типового типа
  • Для объявления элементов в .tsx

Если не в файле .tsx, угловые скобки в парах практически всегда являются признаками наличия параметра типового типа. Можно было бы сформулировать систему выражений как таковых (которая, вероятно, ближе всего вы можете получить):

  • Когда в контексте определения типа, аннотации типа, вызова метода или объявления класса, угловые скобки обозначают параметр типового типа
  • Когда в контексте элемента TSX угловые скобки обозначают элемент, передаваемый компилятором TSX/JSX