首页 > 解决方案 > 使用参数其中 Fn 扩展了一个函数类型

问题描述

这与我在使用 Redux Saga 生成器时遇到的问题有关。他们的定义之一call是(不包括实现):

// this is taken from redux saga and cannot be changed
function call<Fn extends (...args: any[]) => any>(
  fn: Fn,
  ...args: Parameters<Fn>
): CallEffect<SagaReturnType<Fn>> { ... }

我试图这样称呼它:

function test<F extends (a: string, b: number) => any>(f: F) {
  return call(f, 'a', 0)
}

此时我收到错误消息:'["a", 0]' 类型的参数不可分配给'Parameters<F>' 类型的参数。

但是如果Fextends (a: string, b: number) => any,那不应该是可分配的吗?

标签: typescripttypescript-generics

解决方案


诸如Prameters一般情况下的条件类型不能很好地与未解析的泛型类型一起使用。由于类型不确定,打字稿通常不会评估条件类型。

您可以使用稍微不同的签名来解决它call

function call<A extends any[], R>(
  fn: (...a: A) => R,
  ...args: A
): void {}

function test<F extends (a: string, b: number) => any>(f: F): void {
  call(f, 'a', 0)
}

游乐场链接


推荐阅读