【问题标题】:How can I indirectly specify an argument name in a function type?如何在函数类型中间接指定参数名称?
【发布时间】:2021-05-02 06:37:30
【问题描述】:

我想将我的函数类型的参数名称从另一个类型中提取出来。比如可能是这样的:

type F_v1 = (name: number) => boolean;
type A = ["name", number];
//type F_v2 = (A[0]: A[1]) => boolean; // this is not really allowed

有什么办法吗?

(我假设参数名称实际上是其函数类型的一部分 - TypeScript IDE 似乎知道如何从任意函数类型读取参数名称。甚至像 (...as: A) => boolean 这样的东西也会以参数名称结尾例如“as_0”。)

【问题讨论】:

  • 参数的名称实际上并不是签名的一部分
  • 没有。胡安的评论当然是相关的,如果它是正确的。即使在那种情况下,我仍然想以某种方式告诉 IDE 名称是什么,但我想如果没有 IDE 特定的语言扩展(而且我不会对那些感兴趣),这将是不可行的。

标签: typescript


【解决方案1】:

您可以使用带标签的元组 (docs) 和数组扩展语法来做到这一点:

type F_v1 = (name: number) => boolean;

type A = [name: number];
type F_v2 = (...args: A) => boolean;

您甚至可以使用Parameters (docs) 实用程序类型从函数中提取参数类型:

type F_v3 = (...args: Parameters<F_v1>) => boolean;

F_v2F_v3 类型的函数使用与 F_v1 相同的命名参数显示:

const test= (f1: F_v1, f2: F_v1, f3: F_v3) => {
  type T1 = typeof f1 // (name: number) => boolean
  type T2 = typeof f2 // (name: number) => boolean
  type T3 = typeof f3 // (name: number) => boolean
}

对于f3,虽然类型错误有所不同,因为它们将引用args 而不是name

TypeScript playground

【讨论】:

  • 啊酷我不知道带标签的元组。这很好学!我认为这对我的情况没有多大帮助。我仍然想要一种将标签转换为文字类型或将文字类型转换为标签的方法,我想,我想这是不允许的。 (但这并不是什么大不了的事;我可以处理到处都有奇怪的自动生成的参数名称。)
  • 是的,据我所知,没有办法从类型中提取标签字符串。我只是在一些我想漂亮打印函数类型的代码中称它们为x1x2等。
猜你喜欢
  • 2020-05-23
  • 2012-05-22
  • 1970-01-01
  • 2014-08-22
  • 2022-06-18
  • 1970-01-01
  • 2020-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多