为什么我们在 TypeScript 泛型中使用字母 T、U

问题描述 投票:0回答:2

我注意到大多数教程/课程/文章都使用

T
U
...作为泛型类型的名称。到底为什么,为什么不指定正常的名称呢?

typescript naming-conventions typescript-generics identifier
2个回答
7
投票

我注意到大多数教程/课程/文章都使用 T,U... 作为泛型类型的名称。到底为什么,为什么不指定正常的名称呢?

主要是因为它们是平凡且糟糕的例子。

正如我在下面提到的,最好的做法是在某些内容前加上 T 前缀,而不是仅仅说

T
在大多数情况下
Array<T>
是真正开放的典范。如果您要说,编写您自己的 .Net 字典 版本,其中包含键值对,那么您可以在以下 接口 示例中看到为什么可以更明确。

Dictionary<T,U>

// or

Dictionary<TKey, TValue>

摘自我自己对一个非常相似的问题的回答:

在 Typescript 中

<T>
是什么意思?

'T'
将是在运行时而不是 compile 时声明的类型。
T
变量可以是任何未声明的变量(我找不到引用,但我假设可以用于变量名称的任何有效字符集)。类似地,在 中,如果
T
表示的类型不是值类型,而是更复杂的类型(类)或接口,则可以将其命名/声明为
TVehicle
TAnimal
以帮助表示有效类型未来的程序员(并且可以被认为是最佳实践,因为仅仅
T
并不直观)。我更喜欢
TSomething
,因为我知道大写 T 表示泛型类型。
WSometing
ASomething
也有效,但我只是不喜欢它。 (例如,Microsoft 的 API 几乎总是 TContextTEntity)。

您可以向我解释为什么他们在 Typescript 文档中放置 ,而不是放置更具描述性的内容,例如 。对我来说,没有什么和 是一样的。现在每个人都像傻瓜一样使用,还是我错过了什么?

以下这些都是假设。我既不认识设计 TypeScript 通用系统的团队,也不认识编写文档的团队。

泛型的根本级别是能够将

T
用作 任何可能的类型(不要与打字稿
any
混淆)。含义
Array<T>
interface (因为没有更好的词了),当我们创建具体类型时,我们将
T
替换为声明的类型:

Array<number>

那么对于界面

Array<T>
来说,什么比
T
更有意义呢?我不知道。我确实知道
T
必须是类型(数字、字符串等),因此使用
T
是有意义的,因为它是单词 Type 的第一个字母。我认为如果
type
Type 被保留或限制,Array<Type> 会非常令人困惑和/或什至可能无效(目前
type
在某些情况下具有特殊含义,因此这也是一个糟糕的选择),所以避免这些是一个不错的选择。其他语言(C-sharpJava)也选择使用
T
,因此在语言之间切换并能够使用相同的术语是有利的。


3
投票

这只是一个约定;不同种类的事物具有明显不同的名称格式,因此您可以从其名称的书写格式看出它是哪种事物。例如,在 Java、Javascript 和 Typescript 中,通常使用

camelCase
表示变量和方法名称,
UpperCamelCase
表示类名,
UPPER_SNAKE_CASE
表示常量;通常使用
T
作为类型参数。

这样,如果您看到名为

T
的类型,您就知道它是类型参数,而如果您看到名为
Person
的类型,您就知道它不是。如果您看到
person
,您就知道这不是一种类型。由于类型擦除,能够区分类和类型参数非常有用;类在运行时存在,但类型参数在编译期间从代码中删除。 (这在 Java 中比在 Typescript 中更适用,因为在 Java 中,类型参数被删除,而在 Typescript 中,接口和类型别名也会被删除。但该约定来自 Java 和类似语言,因此它一直存在。)

最有可能使用的默认字母是

T
,因为它代表“类型”,然后就像在数学中一样,通常使用连续的字母来表示相同类型事物的多个变量,因此
S
T
U
V
很常见。此外,
K
通常用于通用键类型,
V
用于与其关联的值类型;在某些情况下
E
用于集合中“元素”的类型。

© www.soinside.com 2019 - 2024. All rights reserved.