在TypeScript类型名称中,前缀T代表什么意思?

4

看起来在类型前加字母T是一种常见的模式。

以下是来自一些Flux代码的示例:(链接)

  declare class ReduceStore<TPayload, TState> extends Store<TPayload> {
    getState(): TState;
    getInitialState(): TState;
    reduce(state: TState, action: TPayload): TState;
    areEqual(one: TState, two: TState): boolean;
  }

这个模式是用来干什么的?State 类型和 TState 类型有什么区别?为什么不需要在任何地方导入或定义 TState,它是 TypeScript 的原始类型吗?


1
它是一个通用类型变量,不指代特定的类型。在 TypeScript 和 C# 中,这些变量通常以 T 作为前缀来表示它们指代的是一种类型。 - JLRishe
3
它是一种泛型类型参数。它的名称在尖括号中的声明中引入,并且可以是任何有效的标识符。T前缀只是一些开发人员使用的约定,代表类型。此外,这是Flow而不是TypeScript,因此TypeScript约定并不真正相关。 - Aluan Haddad
1个回答

17

这只是类型参数(也称为泛型)的命名约定。

为什么?类型参数是代码中独特的一种参数(它不表示特定类型或值,而是在该上下文中某种类型的占位符),因此有一些视觉上不同的命名模式对于代码可读性很有用。

在简单情况下,名称T 经常用于类型参数:

interface Collection<T> {
  [index: number]: T;
}

如果您有多个类型参数,也很常见使用不同的单字母大写字母表示每个类型参数:
class Component<P, S> {
  // In React `P` represents "Props" type, and `S` represents "State" type
}

然而,这样的阅读可能会变得非常困难!众所周知,像TS这样的单个字母是某种类型参数,而不是特定类型,但是想象一下引用了PSRSS等代码,并且您必须在阅读代码时搞清楚它们的含义。这可能很困难。因此,为了更好的可读性,您可以使用全名(类型参数名称没有语法限制):
class Component<Props, State> { }

那样做很好。问题是PropsState看起来像是具体的类型名为PropsState,但实际上它们不是。因此,现在你有了另一种潜在的混淆。因此,最后为了保持可读性而不失去它们是占位符类型参数而不是特定类型的提示,使用以T(代表“类型参数”)为前缀的完整名称:

class Component<TProps, TState> { }

这样做的唯一缺点是名称更长,这就是为什么你仍然会经常看到像T这样的东西,特别是在有经验的程序员自然知道它代表什么的情况下,例如Collection<T>很清楚,而Collection<TElement>则不必要。对于React开发人员来说,“props”和“state”是使用React的基础,因此Component<P,S>将非常熟悉。无论如何,最终还是个风格选择。
比你想象中的信息更多。 :)

感谢您提供详细的解释! - jsejcksn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接