【问题标题】:TypeScript + Angular 1 + Filter: Assigning typesTypeScript + Angular 1 + 过滤器:分配类型
【发布时间】:2015-11-03 14:36:21
【问题描述】:

我的 TypeScript 1.5 + AngularJS 1 项目中有以下过滤器:

module Filters{

   export function percentage($filter:angular.IFilterService) {

        return function(input: number, decimals: number): string{
            return $filter('number')(input * 100, decimals) + '%';
        }

    }


    var app = AppModule.getModule();
    app.filter("percentage", Filters.percentage);
}

它假设将输入更改为百分比值 - 我知道,我可以用不同的方式来做,但它与过滤器本身无关 - 它与为过滤器分配类型有关。

使用以下代码,我在编译过程中收到以下错误:

error TS2345: Argument of type 'number' is not assignable to parameter of type '{}[]'.
  Property 'length' is missing in type 'Number'.

这在打字中指出了这一点:

interface IFilterService {
    /**
     * Usage:
     * $filter(name);
     *
     * @param name Name of the filter function to retrieve
     */
    (name: string): IFilterFunc;
}

interface IFilterFunc {
    <T>(array: T[], expression: string | IFilterPatternObject | IFilterPredicateFunc<T>, comparator?: IFilterComparatorFunc<T>|boolean): T[];
}

但是,我不确定是什么问题。有任何想法吗?

【问题讨论】:

标签: angularjs typescript


【解决方案1】:

不确定您使用的是什么版本的类型,但过滤类型的定义已在最新的 1.4+ 类型中更新。

所以definition for filter 在重载的帮助下专门处理你传入的过滤器类型,它看起来像这样:

 interface IFilterService {
    (name: 'filter'): IFilterFilter;
    (name: 'currency'): IFilterCurrency;
    (name: 'number'): IFilterNumber;
    (name: 'date'): IFilterDate;
    (name: 'json'): IFilterJson;
    (name: 'lowercase'): IFilterLowercase;
    (name: 'uppercase'): IFilterUppercase;
    (name: 'limitTo'): IFilterLimitTo;
    (name: 'orderBy'): IFilterOrderBy;
    /**
     * Usage:
     * $filter(name);
     *
     * @param name Name of the filter function to retrieve
     */
    <T>(name: string): T;
}

interface IFilterNumber {
        /**
         * Formats a number as text.
         * @param number Number to format.
         * @param fractionSize Number of decimal places to round the number to. If this is not provided then the fraction size is computed from the current locale's number formatting pattern. In the case of the default locale, it will be 3.
         * @return Number rounded to decimalPlaces and places a “,” after each third digit.
         */
        (value: number|string, fractionSize?: number|string): string;
    }

升级 angular.d.ts 应该可以解决您的问题。看起来您的版本具有错误的过滤器类型,即 fixed during this merge

【讨论】:

  • 谢谢!回家后我会拍它的:)
猜你喜欢
  • 2021-03-01
  • 1970-01-01
  • 2019-10-28
  • 2018-11-04
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 2020-03-17
  • 2022-11-15
相关资源
最近更新 更多