【问题标题】:How to use `typeof` to get the type of a generic function?如何使用`typeof`获取泛型函数的类型?
【发布时间】:2021-06-16 16:44:47
【问题描述】:

有没有办法使用typeof 来获取泛型函数的返回类型?

给定:

function SomeGeneric<ItemT>(a: ItemT) {
  return {
     value: a
  }
}

我想获取函数的返回类型。

我首先假设typeof 应该提供泛型类型,但事实并非如此。当使用下面的SomeReturn&lt;SomeItem&gt; 时,它抱怨SomeReturn 不是泛型类型。

type SomeReturn = ReturnType<typeof SomeGeneric>

所以我尝试输入这个,但我找不到适用于 TSX 文件的语法。

type SomeReturn<ItemT> = ReturnType<typeof SomeGeneric<ItemT>>

有没有办法获取泛型函数的返回类型?请注意,在我的代码中,返回类型更复杂,我真的很想避免显式输入它。

【问题讨论】:

  • 重要的是要注意函数的type 不是通用的。 type FuncType = typeof SomeGeneric = &lt;ItemT&gt;(a: ItemT) =&gt; { value: ItemT; }。所以你不能做typeof SomeGeneric&lt;ItemT&gt;
  • 我认为这可能会起作用type SomeReturn&lt;T&gt; = FuncType extends (a: T) =&gt; infer R ? R : never;,但事实并非如此。我仍然收到unknown

标签: typescript tsx


【解决方案1】:

我想答案实际上取决于您的具体用例 - 特别是您的函数将返回的东西类型。

typeof JavaScript 运算符返回一个表示 primitive 类型的字符串,例如“string”或“number”,我认为这不是您想要的。

但是,还有另一个运算符 instanceof 可能适合您的用例:它是一个谓词运算符,用于测试变量构造函数的 prototype 属性是否出现在对象或类的原型链中的任何位置。换句话说,它可以让您检查(例如)左边的duck 实际上是Duck 的一个实例:

duck = new Duck();

console.log(typeof duck) // "object"
console.log(duck instanceof Duck) // true
console.log(duck instanceof Object) // true

同样,实际答案在很大程度上取决于您的用例,但理想情况下,您应该能够使用 instanceoftypeof 或同时使用两者来编写一个函数,该函数可能以字符串的形式返回确切的值您期望的类型。


值得一提的是 JavaScript 的 in 运算符,您可以在 TypeScript 的 guards 中使用它。

它通过测试查看指定属性是否在指定对象或其原​​型链中来工作。这被称为鸭子打字(如果它看起来像鸭子,像鸭子一样游泳,像鸭子一样嘎嘎叫,那么它可能只鸭子)。

你需要问自己的问题是,为什么我需要知道函数的返回类型?我该怎么办?还有其他方法吗?

如果您最终需要对该类型执行的操作是在其上调用一个您知道只有当对象属于该特定类型时才会出现的函数,那么守卫可能会派上用场。

【讨论】:

  • 我需要特别指出,将SomeReturn 类型作为函数的返回类型的泛型类型。我需要在其他位置将其用作SomeReturn&lt;SomeType&gt;SomeGeneric 创建一个我传递并在其他函数中使用的对象。
猜你喜欢
  • 2020-11-15
  • 1970-01-01
  • 2015-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-04
相关资源
最近更新 更多