我有一个全局有几个常量的执行环境:
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
s需要大量的语法和样板才能起步,所以在这种情况下它们是不受欢迎的。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
的解决方案更简洁。
我仍然在寻找改进它的方法,所以欢迎提出建议/修改。