What are the general rules that dictate when, where, how and why angle brackets, i.e. \"<...>\"
, should be used in TypeScript?
Wh
They are used for multiple, far too semantically distinct expressions for one to formulate a common use case over them. It also depends on context, much like curly brackets. As you probably know, angle brackets in pairs are used:
.tsx
When not in a .tsx
file, angle brackets in pairs are virtually always the indication of the presence of a generic type parameter. One might formulate a system of expressions as such (which is probably the closest you can get):
With questions like this, I'd recommend reading the spec, especially the Grammar section. Syntax like < something >
is used in
Type Parameters
< TypeParameterList >
in section 3.6.1Used with declarations and call signatures of classes, interfaces, functions and more
function heat<T>(food: T): T { return food; }
//^^^^^ Type parameter list
class Pizza<T, E extends Cheese> { toppingA: T; toppingB: E }
//^^^^^^^^^^^^^^^^^^^^ Type parameter list
Type Arguments
< TypeArgumentList >
in section 3.6.2Used with references to generic types and calls to generic functions
var pizza: Pizza<Pepperoni, Mozzarella>;
//^^^^^^^^^^^^^^^^^^^^^^ Type argument list
pizza = heat<{ toppingA: Pepperoni, toppingB: Mozzarella}>(ingredients)
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Type argument list
Update 2018-07-01: As of version 2.9, generic type arguments can also be used in JSX elements and tagged templates.
<MenuItem<Pizza> toppings={[Pepperoni, Mozzarella]} />
//^^^^^^^ Type argument list
const ratingHtml = escapeUserInput<string | number> `Customer ${feedback.customer.username} rated this pizza with <b>${feedback.rating}</b>/10!`
//^^^^^^^^^^^^^^^^ Type argument list
Type Assertions
Defined and used as < Type > UnaryExpression
where UnaryExpression comes from EcmaScript standard in section 4.16
var ingredients = {
toppingA: new Pepperoni,
toppingB: <Mozzarella> fridge.takeSomeCheese()
//^^^^^^^^^^^^ Type assertion
};
JSX expressions (when enabled)
Not documented in the spec, but should follow the the syntax of JSX, which is basically an expression like
<JSXElementName JSXAttributes(optional)> JSXChildren(optional) </JSXElementName>
or
<JSXElementName JSXAttributes(optional) />