我的过滤器(JavaScript):
angular.module('foo').filter('bar', function() {
return function(a, b, c) {
return a + b + c
}
})
我的消费者(TypeScript):
$filter('bar')('a', 'b', 'c') // Error: Cannot invoke an expression whose type lacks a call signature
Here is the typing for $filter
如何为过滤器添加输入?我尝试了以下,但似乎不起作用:
interface BarFilter {
(a: string, b: string, c: string): string
}
module angular {
interface IFilterService {
(name: 'bar'): BarFilter // Error: Specialized overload signature is not assignable to any non-specialized signature
}
}
答案 0 :(得分:2)
与@basarat一样,您可以在$ filter上的每次调用中指定此项,以确定您希望返回的类型,例如:作为这样的特定版本:
$filter<BarFilter>("bar")("x", "y", "z")
...这比使用类型转换要好得多。
另一种选择是扩展ng.IFilterService接口并添加您在那里注册的所有过滤器。然后在注入$filter
时,只需指定YourIFilterService
ng.IFilterService
的内容:
interface YourIFilterService extends ng.IFilterService {
(name: "bar"): BarFilter
}
并像这样使用它:
class BarController {
constructor(private $filter: YourIFilterService) {}
doBarFiltering() {
var bars = this.$filter("bar")("x", "y", "z")
}
}
在我看来,这是一种很好的方式来实现一个相当好的类型安全级别,而不是那么多的努力,因为你会添加到$filter
的打字(如ng.IFilterService
)。< / p>
答案 1 :(得分:0)
您需要明确提供类型(请注意T
未由$filter
声明的任何输入确定。一个快速的:
$filter<Function>('bar')('a', 'b', 'c')