首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使TypeScript推断数组中参数的数目和类型

问如何使TypeScript推断数组中参数的数目和类型
EN

Stack Overflow用户
提问于 2021-01-29 19:47:37
回答 1查看 639关注 0票数 1

我尝试创建一个非常简单的函数,它可以接受:

  1. --回调
  2. --传递给回调

的可选参数数组

普通JS中的函数如下所示:

代码语言:javascript
复制
const callCallback = (cb, args = []) => cb(...args);

回调可能接受任意数量的参数&返回任何参数。问题是我不能正确地用TypeScript来表达回调的类型。我试图像这样声明callCallback的类型(其想法是推断回调的参数和返回类型):

代码语言:javascript
复制
export interface CallCallback {
  <CbReturn, CbArgs>(
    cb: (...optionalArguments: CbArgs[]),
    args?: CbArgs[],
  ): CbReturn
};

但是,这没有起作用,因为它迫使回调使用扩展语法的参数,而这不是我想要做的。

我也找到了this answer,但就目前而言,TS不允许我将扩展参数设置为可选的。

如何将args数和类型推断为cb参数列表?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-29 20:31:22

下面这些有用吗?从本质上说,你是在输入apply

代码语言:javascript
复制
interface ApplyFn {
    <F extends () => any>(fn: F): ReturnType<F>;
    <F extends (...args: any[]) => any>(fn: F, args: Parameters<F>): ReturnType<F>;
}

declare const apply: ApplyFn;

apply((f: number, s: string, t: Date) => f + s + t, [23, "two", new Date]); // OK
apply((f: number, s: string, t: Date) => f + s + t, ["not a number", "two", new Date]); // ERR
apply((f: number, s: string, t: Date) => f + s + t, [123, "two"]); // ERR

apply(() => "nice!", []); // OK
apply(() => "nice!"); // OK
apply((param: number) => "nice!"); // ERR

编辑:上面的类型是有用的,如果你有一个洞为这种类型的函数适应(例如,一个函数参数)。如果您实际上试图定义此函数,则将其表示为标准函数定义更容易:

代码语言:javascript
复制
function apply<F extends () => any>(fn: F): ReturnType<F>;
function apply<F extends (...args: any[]) => any>(fn: F, args: Parameters<F>): ReturnType<F>;
function apply(fn: Function, args: any[] = []) {
  return fn(args);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65960845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档