我怎样才能让我的班级认出这个枚举?

时间:2017-10-21 09:53:25

标签: angular typescript

我有一个枚举,我试图在一个有角度的应用程序中注入一个类。

我无法获取打字稿以识别枚举的属性并获得错误Property 'xs' does not exist on type 'appBreakpoints'

代码:

// appBreakpoints.ts file
export enum appBreakpoints {
    xs = 1, // convert xs to truthy value
    sm,
    md,
    lg,
    xl,
    xxl
}

// In app.module
import { appBreakpoints } from './appBreakpoints'
@NgModule({
    providers: [
        { provide: appBreakpoints, useValue: appBreakpoints}
    ]
});

// In some service
import { appBreakpoints } from './appBreakpoints';
import { Inject } from '@angular/core';
class MyClass {
    constructor(@Inject(appBreakpoints) private appBreakpoints: appBreakpoints) {
        if (0 < this.appBreakpoints.xs) { // TS ERROR: Property 'xs' does not exist on type 'appBreakpoints'
            console.log('something being logged');
        }
    }
}

如何让nickcript识别枚举属性,以便在课堂上使用它们?

2 个答案:

答案 0 :(得分:0)

为什么要使用角度DI?我想这足以导入文件并使用枚举...

// In some service
import { appBreakpoints } from './appBreakpoints';

class MyClass {
    constructor() {
        if (0 < appBreakpoints.xs) {
            console.log('something being logged');
        }
    }
}

无论如何,根据这个angular / cli问题,你应该使用InjectionToken来实现这个目的:

  

您不能使用纯类型进行注入,例如枚举或界面。你需要使用一个InjectionToken,正如@jotatoledo指出的那样。请按照Angular的文档获取有关如何使用令牌的帮助。

https://github.com/angular/angular-cli/issues/8011

https://angular.io/api/core/InjectionToken

答案 1 :(得分:0)

我无法理解你为什么想要通过直接在服务中使用它的枚举来提供服务。

但问题是提供的值是枚举appBreakpoints(即枚举类本身),而你在构造函数中注入的是appBreakPoints类型,因此应该是实例 appBreakpoints(即xs,或sm等)。

要使代码正常工作,您需要将服务更改为

constructor(@Inject(appBreakpoints) private bp: typeof appBreakpoints) {
    if (0 < this.bp.xs) { 
        console.log('something being logged');
    }
}