enums - 如何在 typescript 中定义和使用枚举?

标签 enums compilation compiler-errors typescript

我正在使用 Atom 版本 1.7.5 的 TypeScript

我有一个声明文件 Provision.d.ts,其中包含以下声明

declare module Provision {

export enum ProvisionMode {
    NOOP,
    PRODUCTION,
    DEVELOPMENT,
    TEST,
    DEFAULT
}

export interface ProvisionSettingsService {
    setGlobalProvisionMode(arg0: ProvisionMode, arg1: string, back: Http.HttpDefaultCallback): void;
    getGlobalProvisionMode(arg0: string, back: Http.HttpDefaultCallback): void;
    setPathProvision(arg0: string, arg1: ProvisionMode, back: Http.HttpDefaultCallback): void;
    getPathProvision(arg0: string, back: Http.HttpDefaultCallback): void;
}

}

然后是我的实现文件 Provision.ts

/// <reference path='./Provision.d.ts'/>
module ProvisionImpl{

export class ProvisionServiceCallback implements Http.Callback<Provision.ProvisionMode>{

onSuccess(data: Provision.ProvisionMode): void {

}

onError(): void {
    var console: Console;
    console.log("provision callback Error");
}

}

导出类 ProvisionServiceClient 实现 Provision.ProvisionSettingsService{

 setGlobalProvisionMode(arg0: Provision.ProvisionMode, arg1: string, back : Http.HttpDefaultCallback): void{
      /// ..... various implementations here
 }

 getGlobalProvisionMode(arg0: string , back : Http.HttpDefaultCallback): void{
                /// ..... various implementations here
 }

 setPathProvision(arg0: string, arg1: Provision.ProvisionMode,  back : Http.HttpDefaultCallback): void{
                 /// ..... various implementations here
 }

 getPathProvision(arg0: string,  back : Http.HttpDefaultCallback): void{
      /// ..... various implementations here
 }
 }
 }

当我尝试在我的代码中使用上述实现时,例如 CountryService.ts

/// <reference path='./Provision.d.ts' />
/// <reference path='./Provision.ts' />

class App{
    public switchOp() {

        var client = new ProvisionImpl.ProvisionServiceClient();

        var noop = Provision.ProvisionMode.NOOP ;
        var prod = Provision.ProvisionMode.PRODUCTION ;

        if (this.op){
            client.setGlobalProvisionMode(noop , "dummy" , new Http.HttpDefaultCallback()) ;
        }else{
            client.setGlobalProvisionMode(prod , "dummy" , new Http.HttpDefaultCallback()) ;
        }
    }
}

new App().switchOp();

虽然我的代码编译时没有任何提示,但它始终给我一个错误

Uncaught ReferenceError: Provision is not defined

在这条线上

var noop = Provision.ProvisionMode.NOOP ; 

最佳答案

当您使用declare关键字时,您告诉编译器“确保在运行时会有一些名为X的对象”。这在使用 JavaScript 代码时特别有用,例如需要一些像 jquery 这样的库时。因此,您在这里所做的就是告诉编译器将有一个带有枚举字段的对象 Provision,但您从未真正创建运行时存在的此类对象。

请删除declare关键字,以便编译器为您生成对象。

编辑:此外,正如 @Gautam 所提到的,该文件不得命名为 *.d.ts,而是命名为 *.ts,以便 TypeScript 编译器不会将其视为“仅声明”文件。

查看 this snippet at the TypeScript Playground 中的差异

还要注意 const 与非 const 枚举的行为不同。常量枚举是内联的,因此您只能在结果代码中找到一些数值 (0,1,2,..),而不是 ProvisionMode.Production。这与您上面声明的方式没有问题。

有关更多详细信息,请参阅这个精彩答案:How do the different enum variants work in TypeScript?

关于enums - 如何在 typescript 中定义和使用枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35967122/

相关文章:

printf ("%d", <double> 的 c 行为

java - 请帮助调试该程序中的错误

TypeScript 使用枚举类型而不是字符串类型迭代字符串枚举

java - 包含 2000+1 个枚举常量的枚举类是否达到任何限制?

java - 枚举反射

Java编译错误:

c++ - 我应该将 C++ 应用程序链接到间接使用的共享库吗

c# - Unity 在向 OWIN 添加 Active Directory 访问权限时尝试实例化枚举参数

c# - 为什么一个属性被认为是不明确的,而另一个接口(interface)是只设置的?

java - 机器人类 - 未处理的异常类型 AWTException