在打字稿中定义全新类型的最佳做法?

问题描述 投票:1回答:3

我有一个全局有几个常量的执行环境:

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. enums需要大量的语法和样板才能起步,所以在这种情况下它们是不受欢迎的。
  2. 当我使用type关键字时,它似乎无法创建一个不仅仅是另一个别名的新类型。 (例如type DIRECTION=integer;是允许的,但是type DIRECTION;不是。定义DIRECTION作为整数的别名是不可取的,因为尽管它们在技术上是环境中的整数,但BOTTOM-2是荒谬的,并且应该导致错误。
  3. interface DIRECTION {}似乎导致了所需的行为,让我定义这种新类型。然而,这似乎是对打字系统的滥用(我认为TS的界面基本上等同于类。)

什么是最友好的TS方式来实现这一目标?

typescript types global-variables
3个回答
0
投票

您可以使用consttype

const TOP = 1
const TOP_RIGHT = 2
type DIRECTION = 1 | 2

let x: DIRECTION = TOP

但是,我相信enum是一个更好的解决方案。

例如,这是有效但不可取的:

const ONE = 1
let x: DIRECTION = ONE

0
投票

参考解决方案#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

0
投票

参考想法#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的解决方案更简洁。

我仍然在寻找改进它的方法,所以欢迎提出建议/修改。

© www.soinside.com 2019 - 2024. All rights reserved.