在 TypeScript 中,何时、何地、如何以及为什么应该使用尖括号(即<...>
)的一般规则是什么?
虽然我认为我理解了许多单个使用这些括号的情况,但我很难看到它们使用的一般模式:它们有时似乎在事物之前添加,有时在事物之后追加;有时用于泛型,有时用于特定类型;有时出现在我本来希望使用冒号语法的地方。
我想要一个简洁但详尽/通用的解释,介绍括号的含义、确切的语法、应该何时使用它们、不应该使用它们的情况等等。
在 TypeScript 中,何时、何地、如何以及为什么应该使用尖括号(即<...>
)的一般规则是什么?
虽然我认为我理解了许多单个使用这些括号的情况,但我很难看到它们使用的一般模式:它们有时似乎在事物之前添加,有时在事物之后追加;有时用于泛型,有时用于特定类型;有时出现在我本来希望使用冒号语法的地方。
我想要一个简洁但详尽/通用的解释,介绍括号的含义、确切的语法、应该何时使用它们、不应该使用它们的情况等等。
对于这样的问题,我建议阅读规范,特别是语法部分。像< something >
这样的语法在其中使用。
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) />
UnaryExpression as Type
,因为前一种语法在 .tsx
文件中存在歧义。 - John Weisz它们用于多种语义明显不同的表达式,无法为其制定通用用例。这也取决于上下文,就像花括号一样。如您所知,成对的尖括号用于以下用途:
.tsx
中声明元素当不在.tsx
文件中时,成对的尖括号几乎总是表示存在泛型类型参数的指示。可以将表达式系统制定如下(这可能是最接近的):
var circle = <Circle> shape;
,在某些东西之后使用尖括号:var x: KeyValuePair<number, string> = [10, "ten"];
,仅使用尖括号(即既不在之前也不在之后):var <ClassName> = (function () {...
。当我说“冒号语法”时,我的意思是有时你会看到<string>
,有时你会看到... : string
。感谢您提供的具体解释,但我正在寻找一组详尽(但简洁明了)的规则。 - Andrew Willems