我有一个全局包含多个常量的执行环境:
TOP = 1
TOP_RIGHT = 2
RIGHT = 3
BOTTOM_RIGHT = 4
BOTTOM = 5
BOTTOM_LEFT = 6
LEFT = 7
TOP_LEFT = 8
我很清楚,这 8 个常数不仅仅是任意常数,而是一组方向。 因此,我希望它们属于DIRECTION
类型,以便我可以执行以下操作:
let test: DIRECTION = TOP_LEFT;
let foo: DIRECTION = TOP;
let bar: DIRECTION = LEFT;
let target: DIRECTION = RIGHT;
我已经考虑了几种如何实现这一目标的选项(即在direction.d.ts
文件中放入什么):
enum
需要大量的语法和样板才能启动,因此在这种情况下它们是不可取的。- 当我使用
type
关键字时,似乎无法创建一个不仅仅是另一个别名的新类型。(例如type DIRECTION=integer;
是允许的,但type DIRECTION;
不是。 将 DIRECTION 定义为整数的别名是不可取的,因为尽管它们在技术上是环境中的整数,但BOTTOM-2
是无意义的,应该会导致错误。 interface DIRECTION {}
似乎导致了所需的行为,让我定义这个新类型。 然而,这似乎是对打字系统的滥用(我的印象是 TS 的接口基本上等同于类。
此目的最 TS 友好的方法是什么?
您可以使用const
和type
来实现此目的:
const TOP = 1
const TOP_RIGHT = 2
type DIRECTION = 1 | 2
let x: DIRECTION = TOP
但是,我认为enum
是为此目的更好的解决方案。
例如,这是有效的,但不是可取的:
const ONE = 1
let x: DIRECTION = ONE
参考解决方案#1,如最初发布的那样:
declare const enum Direction {
TOP = 1,
TOP_RIGHT = 2,
RIGHT = 3,
BOTTOM_RIGHT = 4,
BOTTOM = 5,
BOTTOM_LEFT = 6,
LEFT = 7,
TOP_LEFT = 8
}
declare const TOP=Direction.TOP
declare const TOP_RIGHT=Direction.TOP_RIGHT
declare const RIGHT=Direction.RIGHT
declare const BOTTOM_RIGHT=Direction.BOTTOM_RIGHT
declare const BOTTOM=Direction.BOTTOM
declare const BOTTOM_LEFT=Direction.BOTTOM_LEFT
declare const LEFT=Direction.LEFT
declare const TOP_LEFT=Direction.TOP_LEFT
参考想法#3,如上文所示:
interface DIRECTION {}
declare const TOP: DIRECTION;
declare const TOP_RIGHT: DIRECTION;
declare const RIGHT: DIRECTION;
declare const BOTTOM_RIGHT: DIRECTION;
declare const BOTTOM: DIRECTION;
declare const BOTTOM_LEFT: DIRECTION;
declare const LEFT: DIRECTION;
declare const TOP_LEFT: DIRECTION;
此代码比具有enum
的解决方案要简洁得多。
但是,我仍在寻找改进它的方法,因此欢迎提出建议/更改。