angularjs - TypeScript + Angular 1 + Filter: Tilldelar typer


Jag har följande filter i mitt TypeScript 1.5 + AngularJS 1-projekt:

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

Det ska ändra inmatningen till procentvärdet - jag vet, jag kan göra det på ett annat sätt, men det handlar inte om filtret i sig - det handlar om att tilldela typer till filtret.

Med följande kod får jag följande fel under kompilering:

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

Vilket pekar mig till detta i typdefinitionerna:

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[];
}

Jag är dock inte riktigt säker på vad problemet är. Några idéer?

Svar #1

Inte säker på vilken version av typningar du använder, men definitionen av filtertypningar har uppdaterats sedan i de senaste 1.4+ typningarna.

Så definitionen för filter hanterar specifikt den filtertyp du skickar in med hjälp av överlagringar, det ser ut så här:

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

Att uppgradera angular.d.ts borde lösa ditt problem. Det ser ut som att du har en version som har buggar i Filter-typerna som åtgärdades under denna sammanfogning.