【问题标题】:how to define and use an enum in typescript ?如何在打字稿中定义和使用枚举?
【发布时间】:2016-03-13 06:08:48
【问题描述】:

我正在使用带有 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");
}

}

导出类 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 ; 

【问题讨论】:

  • 你能用export module试试吗,检查生成的javascript..它是否创建了一个名为Provision的变量并在该变量上创建枚举??
  • 环境声明 (*.d.ts) 主要用于声明 JS 中存在的东西,而不是实际提供它们。把它改成.ts源文件,我相信它会工作的。

标签: enums compilation compiler-errors typescript


【解决方案1】:

当您使用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?

【讨论】:

  • 是的。我用我的 .d.ts 文件中的导出声明和我的 .ts 文件中没有的定义更新了我的代码.. 似乎工作
  • 你能用我在另一个答案中添加的额外细节更新答案吗?我会选择你的?
【解决方案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;
}

}

【讨论】:

    猜你喜欢
    • 2020-01-29
    • 2018-09-16
    • 2020-04-14
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    相关资源
    最近更新 更多