在打字稿中定义全新类型的最佳实践?



我有一个全局包含多个常量的执行环境:

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文件中放入什么):

  1. enum需要大量的语法和样板才能启动,因此在这种情况下它们是不可取的。
  2. 当我使用type关键字时,似乎无法创建一个不仅仅是另一个别名的新类型。(例如type DIRECTION=integer;是允许的,但type DIRECTION;不是。 将 DIRECTION 定义为整数的别名是不可取的,因为尽管它们在技术上是环境中的整数,但BOTTOM-2是无意义的,应该会导致错误。
  3. interface DIRECTION {}似乎导致了所需的行为,让我定义这个新类型。 然而,这似乎是对打字系统的滥用(我的印象是 TS 的接口基本上等同于类。
实现

此目的最 TS 友好的方法是什么?

您可以使用consttype来实现此目的:

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的解决方案要简洁得多。

但是,我仍在寻找改进它的方法,因此欢迎提出建议/更改。

相关内容

  • 没有找到相关文章

最新更新