8
enum KINDS {
  STATIC = 1,
  FIELD,
  ARG,
  VAR
}

enum ALL_KINDS {
  STATIC = 1,
  FIELD,
  ARG,
  VAR,
  NONE
}

How can I reuse the first enum inside the second one?

2
  • By "re-use" you mean you want ALL_KINDS to include the entries, with the same values, from KINDS? Commented Sep 29, 2019 at 19:13
  • Yup @DaveNewton. Commented Sep 29, 2019 at 20:07

1 Answer 1

4

AFAIK, extending enums is under consideration, in the meantime you can use const objects instead:

const KINDS = <const>{
  STATIC: 1,
  FIELD: 2,
  ARG: 3,
  VAR: 4
};

const ALL_KINDS = <const>{ ...KINDS, NONE: 5 };

There are also other workarounds in the above thread.

If you want this type to be checked, note that from the type perspective, a numeric enum is equivalent to number:

enum KINDS {
  STATIC,
  FIELD,
  ARG,
  VAR
}

declare function func(name: string, type: string, kind: KINDS): any;

func('foo', 'bar', KINDS.ARG); // compiles
func('foo', 'bar', 99); // compiles too (?)

If you use an object as suggested above, you can also enforce strict type checking by creating a type for all possible values of that object:

const KINDS = <const>{
  STATIC: 1,
  FIELD: 2,
  ARG: 3,
  VAR: 4
};

type KIND_VALUE = typeof KINDS[keyof typeof KINDS]

declare function define(name: string, type: string, kind: KIND_VALUE): any;

define('foo', 'bar', KINDS.ARG); // compiles
define('foo', 'bar', 99); // doesn't compile

This is a bit more verbose, but then you have your type actually checked.

Sign up to request clarification or add additional context in comments.

1 Comment

In the method declaration, define(name: string, type: string, kind: KINDS) {}, it shows an error 'KINDS' refers to a value , but is being used as a type here. That is way I used enum.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.