角度过滤器+打字稿

Ant*_*EVE 6 javascript angularjs typescript

我有一个非常简单的角度滤波器.

此过滤器接受输入枚举的成员(此处称为XEnum)并返回表示枚举中成员的字符串:

module Filters {
    "use strict";

    export function XEnumToStringFilter() {
        return ( input: XEnum ) => {
            return XEnum[input];
        }
    }
}

[...]

module Model {
    export enum XEnum{
        Started = 0,
        Stopped = 1
    }
}

[...]

app.filter( "xEnumToStringFilter", [Filters.XEnumToStringFilter] );
Run Code Online (Sandbox Code Playgroud)

当我在视图中使用xEnumToStringFilter时,这非常有效:

{{0 | etatTransfertEnumToStringFilter}} 打印 Started

{{1 | etatTransfertEnumToStringFilter}} 打印 Stopped

但我想在我的服务中使用此过滤器:

app.service( "serviceUsingXEnum",
        ["xEnumToStringFilter",
            Services.ServiceUsingXEnum] );
Run Code Online (Sandbox Code Playgroud)

但在我的服务构造函数中,我只得到一个奇怪的错误:

module Services {
    "use strict";

    export class ServiceUsingXEnum {

        constructor(
            private xEnumToStringFilter: Filters.XEnumToStringFilter // error here
            ) {
            // some beautiful code ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

模块Filters没有导出成员XEnumToStringFilter

即使我的自动完成说它存在!

我想使用依赖注入,我可以做,Filters.XEnumToStringFilter()(somethingXEnum)但那很糟糕!

为什么我不能将XEnumToStringFilter用作类型?

有什么更好的解决方法?

Mar*_*Zen 4

那是因为您使用该函数作为类型声明。您可以:

1)更改服务的构造函数声明:

constructor(private xEnumToStringFilter: ( enum: XEnum ) => string )

或者

2)创建一个接口并在要使用过滤器的地方使用它的接口:

module Filters {
    "use strict";

    export interface IXEnumToStringFunction {
          ( input: XEnum ) => string
    }

    export function XEnumToStringFilter() {
        return ( input: XEnum ) => {
            return XEnum[input];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

...

然后在构造函数中

constructor(private xEnumToStringFilter: Filters.IXEnumToStringFunction )