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中
但是,我宁愿使用枚举,而不是声明一组全局变量。如果我不想使用方向访问它怎么办。左上
,而是使用左上
?然后只声明一组常量