【问题标题】:what does the prefix T mean in type names for typescript打字稿的类型名称中的前缀 T 是什么意思
【发布时间】:2020-02-13 13:51:39
【问题描述】:

在类型前加上字母 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 原语吗?

【问题讨论】:

  • 它是一个泛型类型变量。它不涉及特定类型。在 TypeScript 和 C# 中,它们通常以 T 为前缀,表示它们引用了一个类型。
  • 它是一个泛型类型参数。它的名称在尖括号之间的声明中引入,可以是任何有效的标识符。 T 前缀只是一些开发人员使用的约定,代表类型。此外,这是 Flow 而不是 TypeScript,因此 TypeScript 约定并不真正相关

标签: typescript flowtype flux


【解决方案1】:

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

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

在简单的情况下,对于类型参数,名称 Toften 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这样的单个字母是某种类型参数,而不是特定类型,但是想象一些引用PSRSS的代码和你必须在阅读代码时弄清楚这意味着什么。它会变得很难。因此,为了更好的可读性,您可以使用全名(类型参数名称没有语法限制):

class Component<Props, State> { }

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

class Component<TProps, TState> { }

唯一的缺点是名称较长,这就是为什么您仍然会看到 T 和如此常用的名称,尤其是在经验丰富的程序员自然会知道它代表什么的情况下,例如 Collection&lt;T&gt;很清楚,Collection&lt;TElement&gt; 不是必需的,对于 React 开发人员来说,“props”和“state”是使用 React 的基础,所以Component&lt;P, S&gt; 将是众所周知的。无论哪种方式,最终它仍然是一种风格选择。

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

【讨论】:

  • 感谢扩展解释!
猜你喜欢
  • 2020-01-01
  • 2021-04-07
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-15
相关资源
最近更新 更多