我能想象的最接近于回答这个问题的方式(不仅仅是我的观点)是指向一些描述“TypeScript类型参数命名约定”的文档,并将其与您链接的Java泛型教程文档进行比较。
如果是这样,TypeScript设计团队对此的官方立场似乎是“我们不打算将任何这样的约定强加给其他人”,或者“TS中没有规范的命名约定”。见microsoft/TypeScript#6168和microsoft/TypeScript#878,具体如下:
[一] 一般来说,我们对决定人们的风格不感兴趣。如果说TS有一种认可的样式,那就违背了我们的理念,即我们在这里为JS提供类型,而不管您如何编写它(当然,在合理的参数范围内)????).
还有ESLint的naming-convention
规则和TSLint的naming-convention
规则,它们使得在linter-checked代码库中强制类型参数命名约定成为可能,但在默认情况下似乎没有这样做。因此,似乎没有哪一项公约足够正式,可以在违约情况下强制执行。
为了进行比较,让我们看一下您链接的Java泛型教程文档中的相关部分:
Type Parameter Naming Conventions
按照惯例,类型参数名称是单个大写字母。这与您已经知道的变量命名约定形成了鲜明的对比,并且有充分的理由:没有这种约定,很难区分类型变量和普通类或接口名称之间的区别。
最常用的类型参数名称有:
- E元素(Java集合框架广泛使用)
- K键
- N—编号
- T型
- V值
- S、 U、V等-第2、3、4类
您将看到这些名称在整个javaseapi和本课程的其余部分中使用。
请注意,上面列举的列表被描述为“最常用的类型参数名称”,而不是“唯一允许的类型参数名称”;它是一个示例列表,因此是描述性的,而不是规定性的。
选择“单个大写字母”的部分更接近于一个规定:大写字母倾向于区分类型名和变量名,single-character类型名倾向于区分类型参数和类或接口等特定类型。但我也有同样的感觉,这与其说是上天的命令,倒不如说是对一般做法的观察。
因此,我们可以假设到此为止,并说“TypeScript或Java中都没有正式或规范的类型参数命名约定,任何非官方的此类约定都是opinion.的问题。”
但是为了列出我认为的打字中的非正式惯例是什么,我将继续。请记住,这是我的意见,人们可能会不同意。
我想说,上面列出的Java命名约定与我认为的TypeScript泛型类型参数的实际命名约定非常一致:使用单个大写字符,或者对应于它们所表示的第一个字母,例如:
-
T
为“type”,是最通用的,因此也是最常用的类型参数名; -
K
表示“key”,或P
表示“property”,两者都倾向于受PropertyKey
或keyof T
或keyof SomeInterface
或keyof SomeClass
的约束; -
V
表示“value”,最常用作成对使用,K
表示“key”; -
A
表示“arguments”,R
表示“return”,分别对应函数签名的rest参数列表和返回类型,如(...args: A) => R
; -
N
表示“number”,S
表示“string”,B
表示“boolean”,表示受原语约束的类型参数;
或一些相关类型的序列,例如:
-
T
、U
、V
、W
等等,从T
开始表示“类型”,然后在需要更多类型时遍历字母表,记住这样只能得到一些类型; -
A
、B
、C
、D
等等,从字母表的开头开始,当您希望使用一大堆类型参数,而您还没有将类型参数用于其他对象时。
这样的约定不是绝对的,在必要的时候会倾向于弯曲,以避免模棱两可或其他混淆。如果需要的类型参数超过了在没有名称冲突的情况下可以获得的数量,则最好在名称中添加一个字符:
-
T0
、T1
、T2
、T3
等,追加数字得到相关类型的序列; -
KT
, KU
, KV
: prefixing K
for "keys of" T
, U
, and V
, respectively;
它与我所认为的常规名称相去甚远,但仍然很常见,可以编写简短的大写名称来更详细地描述类型所代表的内容,缺点是它们可能开始被混淆为特定类型而不是类型参数:
-
Key
, Val
, Prop
, Arg
, Ret
, Type
, This
以下是非常规的(记住,我的观点在这里!)除非有充分的理由,否则应避免:
- 看起来像接口或类名的长名称,如
InputType
或Properties
; - 在较长的类型名(如
TNotRecommended
)前面加上大写字母T
; - 以小写字母开头的名称,如
t
或u
或myType
;