【问题标题】:Two functions with same arguments but different return type具有相同参数但返回类型不同的两个函数
【发布时间】:2019-04-15 03:03:56
【问题描述】:

我有一个函数,它接受两个函数作为参数(fn1fn2)。这些函数应该采用相同的任意数量的参数,具有相同的类型但不同的返回类型。

有没有办法确保函数的参数类型相同?

function myFunction(fn1: Function, fn2: (...args: any[]) => string): number {
    return 0;
}

【问题讨论】:

  • 任何返回类型?还是myFunction指定的两种类型?
  • 第一个函数的返回类型可以是任意类型。第二个函数的返回类型总是字符串。

标签: function typescript generics


【解决方案1】:

您可以使用conditional typestuples in rest parameters 从第一个函数中提取参数类型,并根据提取的参数指定第二个函数

type ArgTypes<T> = T extends (...a:infer A) => unknown?A:[]

function myFunction<T extends (...a: unknown[]) => unknown>(fn1: T, fn2: (...a: ArgTypes<T>) => string) :number {
    return 0;
}

myFunction((s: string) => s, (s:string) => s) //ok
myFunction((s: string) => s, (s:number) => s.toString()) //err

【讨论】:

  • function myFunction&lt;T extends Function&gt;(fn1: T, fn2: (...a: ArgTypes&lt;T&gt;) =&gt; string) :number 也应该可以工作
  • @dotjpg3141 我避免直接​​使用Function .. 但这也应该有效:)
猜你喜欢
  • 1970-01-01
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多