1

我遇到的问题是使用Array<T>.filter和接口定义之间的差异。

我在 Angular2 组件中实现了这个过滤器:

  performFilter(filterBy: string): IProduct[] {
    filterBy = filterBy.toLocaleLowerCase();
    return this.products.filter((p: IProduct) =>
      p.productName.toLocaleLowerCase().indexOf(filterBy) !== -1);
  }

奇怪的是当我进入接口定义时:

我在用着

Array<T>.filter(callbackfn: (value: T, index: number, array: T[]) => any, 
thisArg?: any): T[];

我提供的回调函数其实是:

callbackfn: (value: T) => boolean

但是界面显示了 2 个其他参数 - 索引和数组作为非可选参数。然而,这一切都可以编译和工作。我认为可选参数意味着

callbackfn: (value: T, index?: number, array?: T[]).

就未记录行为的打字稿编译器而言,是否还有其他事情发生?

4

1 回答 1

1

来自TypeScript 的常见问题解答

这是预期和期望的行为。首先,请参阅常见问题解答顶部的“可替代性”入门 - 处理程序是回调的有效参数,因为它可以安全地忽略额外的参数。

具有较少参数的函数的行为方式仍与具有所有参数的函数相同,这意味着可以安全地忽略缺少的参数。这使用了一个名为Substitutability的概念,这基本上意味着如果 X 可以被 Y 替换,则 X 是 Y 的子类型。

可选参数和必需参数之间的区别

函数签名总是从调用者的角度读取。

arg?: number和之间的区别arg: number。前一个是可选的,可以由该函数的调用者提供或不提供。后者是必需的,并且总是由调用者提供。

换句话说,如果需要像 一样的参数callbackfn: (value: T, index: number, array: T[]),则不存在检查这些参数之一并发现它是 的情况undefined

但是,在callbackfn: (value: T, index?: number, array?: T[])示例中,index可能是也可能不是undefined

笔记

目前在 TypeScript 中没有办法指示必须存在回调参数。

于 2019-02-05T22:03:42.457 回答