TypeScript - "[]" 可赋给 "P" 类型的约束,但可以使用约束 "[]" 的其他子类型实例化 "P"?

function load<T, P extends [], F extends (...args: P) => Promise<T>>(
  loader: F,
  lazy = false,
) {
  let data: T | undefined, error: unknown
  const refresh: (...args: P) => void = (...args) =>
    void loader(...args)
      .then(d => (data = d))
      .catch((e: unknown) => (error = e))

  /**
   * 类型“[]”的参数不能赋给类型“P”的参数。
   *   "[]" 可赋给 "P" 类型的约束,但可以使用约束 "[]" 的其他子类型实例化 "P"。ts(2345)
   */
  if (!lazy) refresh()

  return { refresh, data, error }
}

// { refresh: () => void; data: unknown; error: unknown }
load((a?: number, b?: number) => Promise.resolve((a ?? 0) + (b ?? 0)))

我希望 loader 函数没有参数列表,或者所有参数都是可选的。

同时返回值的类型应该是 { refresh: (a?: number, b?: number) => void, data: number | undefined; error: unknown }

阅读 817
1 个回答
function load<T, P extends any[] = any[], F extends (...args: P) => Promise<T> = (...args: any[]) => Promise<T>>(
  loader: F,
  lazy = false,
): { refresh: (...args: P) => void; data: T | undefined; error: unknown } {
  let data: T | undefined, error: unknown;
  const refresh: (...args: P) => void = (...args: P) => {
    loader(...args)
      .then(d => (data = d))
      .catch(e => (error = e));
  };


  if (!lazy) refresh(...([] as P extends [] ? [] : never)); 
  return { refresh, data, error };
}

// 用法
const loaderFunction = (a?: number, b?: number) => Promise.resolve((a ?? 0) + (b ?? 0));
const { refresh, data, error } = load(loaderFunction);


refresh();    
refresh(1);     
refresh(1, 2);  
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Microsoft
子站问答
访问
宣传栏