[英]How do I add typings for an existing Angular1 $filter function in TypeScript?
我的过滤器(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
如何为过滤器添加类型? 我尝试了以下方法,但似乎不起作用:
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
}
}
就像提到的@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
)。
您需要显式提供类型(注意T
不是由$filter
声明的任何输入确定的)。 一个快速的:
$filter<Function>('bar')('a', 'b', 'c')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.