网站搜索

编译 - 如何在 TypeScript 中定义和使用枚举?


我正在使用 TypeScript 和 Atom 版本 1.7.5

我有一个声明文件 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");
}

}

export class 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 ; 

答案#1

当你使用declare关键字时,你告诉编译器“确保在运行时有一个名为X的对象”。这在处理JavaScript代码时尤其有用,例如在引入一些像jquery这样的库时。所以你在这里做的,是告诉编译器将会有一个带有枚举字段的Provision对象,但实际上你从未创建过这样一个在运行时存在的对象。

请移除 declare 关键字,这样编译器会为你生成对象。

编辑:另外,正如 @Gautam 所提到的,该文件必须命名为 *.ts 而不是 *.d.ts,否则 TypeScript 编译器会将其视为仅声明文件。

在 TypeScript Playground 中查看此代码片段的差异

还要注意 const 枚举和非 const 枚举,它们的行为不同。Const 枚举是内联的,所以在生成的代码中,你只会看到一些数字值(0,1,2,..),而不是 ProvisionMode.PRODUCTION。按你上面声明的方式,这没有任何问题。

有关更多详细信息,请参阅这个很棒的回答:TypeScript 中不同的枚举变体是如何工作的?

答案#2

真正的答案在上面——这是一个更快/更简单的版本

它应该在一个 .ts 文件中定义。

module Provision {

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

export {ProvisionMode} ;

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

}