如何在TypeScript中为现有的Angular1 $过滤器函数添加输入法?

时间:2016-03-17 22:54:10

标签: javascript angularjs 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

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
  }
}

2 个答案:

答案 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')