这只是类型参数(也称为泛型)的命名约定。
为什么?类型参数是代码中独特的一种参数(它不表示特定类型或值,而是在该上下文中某种类型的占位符),因此有一些视觉上不同的命名模式对于代码可读性很有用。
在简单情况下,名称T
经常用于类型参数:
interface Collection<T> {
[index: number]: T;
}
如果您有多个类型参数,也很
常见使用不同的单字母大写字母表示每个类型参数:
class Component<P, S> {
}
然而,这样的阅读可能会变得非常困难!众所周知,像
T
和
S
这样的单个字母是某种类型参数,而不是特定类型,但是想象一下引用了
P
,
S
,
R
,
SS
等代码,并且您必须在阅读代码时搞清楚它们的含义。这可能很困难。因此,为了更好的可读性,您可以使用全名(类型参数名称没有语法限制):
class Component<Props, State> { }
那样做很好。问题是Props
和State
看起来像是具体的类型名为Props
和State
,但实际上它们不是。因此,现在你有了另一种潜在的混淆。因此,最后为了保持可读性而不失去它们是占位符类型参数而不是特定类型的提示,使用以T
(代表“类型参数”)为前缀的完整名称:
class Component<TProps, TState> { }
这样做的唯一缺点是名称更长,这就是为什么你仍然会经常看到像
T
这样的东西,特别是在有经验的程序员自然知道它代表什么的情况下,例如
Collection<T>
很清楚,而
Collection<TElement>
则不必要。对于React开发人员来说,“props”和“state”是使用React的基础,因此
Component<P,S>
将非常熟悉。无论如何,最终还是个风格选择。
比你想象中的信息更多。 :)