Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在TypeScript中声明将映射到环境定义的全局属性的枚举?_Javascript_Typescript_Enums - Fatal编程技术网

Javascript 如何在TypeScript中声明将映射到环境定义的全局属性的枚举?

Javascript 如何在TypeScript中声明将映射到环境定义的全局属性的枚举?,javascript,typescript,enums,Javascript,Typescript,Enums,我有一个全局具有多个常量的环境: TOP = 1 TOP_RIGHT = 2 RIGHT = 3 BOTTOM_RIGHT = 4 BOTTOM = 5 BOTTOM_LEFT = 6 LEFT = 7 TOP_LEFT = 8 我很清楚,这8个常数不仅仅是任意常数,实际上是一组方向。因此,我希望它们是方向类型,这样我就可以这样做: let test: DIRECTION = TOP_LEFT; enum类型似乎是实现这一点的最合乎逻辑的方法,但我遇到了以下问题: 我以前尝试过实现这种行

我有一个全局具有多个常量的环境:

TOP = 1
TOP_RIGHT = 2
RIGHT = 3
BOTTOM_RIGHT = 4
BOTTOM = 5
BOTTOM_LEFT = 6
LEFT = 7
TOP_LEFT = 8

我很清楚,这8个常数不仅仅是任意常数,实际上是一组方向。因此,我希望它们是
方向
类型,这样我就可以这样做:

let test: DIRECTION = TOP_LEFT;
enum
类型似乎是实现这一点的最合乎逻辑的方法,但我遇到了以下问题:


我以前尝试过实现这种行为,但有一些困难

src/main.ts(1,23): error TS2304: Cannot find name 'TOP_LEFT'.
类型脚本文件:

main.ts:

let test: DIRECTION = TOP_LEFT;
console.log(test);
方向d.ts:

declare enum DIRECTION {
    TOP = 1,
    TOP_RIGHT = 2,
    RIGHT = 3,
    BOTTOM_RIGHT = 4,
    BOTTOM = 5,
    BOTTOM_LEFT = 6,
    LEFT = 7,
    TOP_LEFT = 8,
}
忽略编译错误,运行“tsc”(也称为transpiled代码)的JavaScript结果看起来将访问预定义的全局属性:

let test = TOP_LEFT;
console.log(test);

如何以友好的方式获取此类输出?

您已声明环境枚举:。它们通常用于为预先存在的类型(例如,在导入的js库中定义的类型)提供类型信息。如果你看传输的代码,你会发现它没有 实际上发出了任何类型的查找

声明枚举的常规方法是:

 enum DIRECTION {
    TOP = 1,
    TOP_RIGHT = 2,
    RIGHT = 3,
    BOTTOM_RIGHT = 4,
    BOTTOM = 5,
    BOTTOM_LEFT = 6,
    LEFT = 7,
    TOP_LEFT = 8,
}
这将产生:

var DIRECTION;
(function (DIRECTION) {
    DIRECTION[DIRECTION["TOP"] = 1] = "TOP";
    DIRECTION[DIRECTION["TOP_RIGHT"] = 2] = "TOP_RIGHT";
    DIRECTION[DIRECTION["RIGHT"] = 3] = "RIGHT";
    DIRECTION[DIRECTION["BOTTOM_RIGHT"] = 4] = "BOTTOM_RIGHT";
    DIRECTION[DIRECTION["BOTTOM"] = 5] = "BOTTOM";
    DIRECTION[DIRECTION["BOTTOM_LEFT"] = 6] = "BOTTOM_LEFT";
    DIRECTION[DIRECTION["LEFT"] = 7] = "LEFT";
    DIRECTION[DIRECTION["TOP_LEFT"] = 8] = "TOP_LEFT";
})(DIRECTION || (DIRECTION = {}));
然后您可以这样使用它:

const t: DIRECTION = DIRECTION.TOP_LEFT;

您错误地解释了枚举的使用。EnUM在JavaScript中不存在,例如,C++。编译器编译枚举声明时,将在其位置创建一个新变量,并使用映射来检索键和值

以下枚举

enum Example {
    One,
    Two
}
…是与以下Javascript对象等效的TypeScript:

var Example;
(function (Example) {
    Example[Example["One"] = 0] = "One";
    Example[Example["Two"] = 1] = "Two";
})(Example || (Example = {}));
您所追求的似乎是映射到类型的一组常量。您可以在TypeScript中声明文字类型。e、 g.
声明类型方向=1 | 2 | 3…|8;。然而,当您重构代码或添加更多的方向常量时,这并不是真正有用的。幸运的是,您可以使用
typeof
关键字来获取对象的值。您可以按如下方式声明您的
方向
类型:

const TOP = 1
const TOP_RIGHT = 2
const RIGHT = 3
const BOTTOM_RIGHT = 4
const BOTTOM = 5
const BOTTOM_LEFT = 6
const LEFT = 7
const TOP_LEFT = 8

declare type Direction =
    typeof TOP |
    typeof TOP_RIGHT |
    typeof RIGHT |
    typeof BOTTOM_RIGHT |
    typeof BOTTOM |
    typeof BOTTOM_LEFT |
    typeof LEFT |
    typeof TOP_LEFT;

const dir: Direction = TOP_LEFT; // or = 8
使用此类型的
方向声明的变量必须具有与该类型匹配的值,例如,在案例1到案例8中


但是,我宁愿使用枚举,而不是声明一组全局变量。

如果我不想使用
方向访问它怎么办。左上
,而是使用
左上
?然后只声明一组
常量