我遇到的问题是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[]).
有没有别的东西发生了打字稿编译器是无证行为的条款?
这是预期和期望的行为。首先,请参阅“可替代性”引物的FAQ的顶部 - 处理程序回调有效的参数,因为它可以安全地忽略额外的参数。
用更少的参数的功能仍然会表现以同样的方式作为一个与所有的参数,这意味着缺少的,可以忽略。这使用称为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
。
目前没有打字稿的方式,表明回调参数必须存在。