打字稿的类型名称中的前缀 T 是什么意思

what does the prefix T mean in type names for typescript

在类型前加上字母 T 似乎是一种常见的模式。

这是来自 some flux code 的示例:

  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 原语吗?

这只是 type arguments (aka generics) 的命名约定。

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

在简单的情况下,名称 T 是类型参数的 often used

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

如果你有多个类型参数,它也是 common to use 每个类型参数的不同单字母大写:

class Component<P, S> {
  // In React `P` represents "Props" type, and `S` represents "State" type
}

但是,这会变得很难阅读!众所周知,像 TS 这样的单个字母是某种类型参数,而不是特定类型,但想象一下一些引用 PSR, SS, 你必须在阅读代码时理清这意味着什么。它会变得很难。因此,为了更好的可读性,您可以使用全名(类型参数名称没有语法限制):

class Component<Props, State> { }

效果很好。问题是 PropsState 看起来可能是名为 PropsState 的实际具体类型,但它们不是。所以现在你有一种不同的潜在困惑。所以最后,为了保持可读性而不丢失它们是占位符类型参数而不是特定类型的提示,请使用前缀为 T 的全名(对于 "Type argument"):

class Component<TProps, TState> { }

唯一的缺点是名称较长,这就是为什么您仍然看到 T 和此类常用的原因,特别是在经验丰富的程序员自然会知道它代表什么的上下文中,因为示例 Collection<T> 非常清楚,Collection<TElement> 不是必需的,对于 React 开发人员来说 "props" 和 "state" 是使用 React 的基础,所以 Component<P, S> 将会广为人知。最后,这仍然是一种风格选择。

比您可能想要的更多信息。 :)