Dart Enum Generics with Example

Enum in Dart introduced Generics to constants.

Generics can be defined during enum declaration, Generics helps developer to avoid type safety errors.

This tutorials explains multiple things

  • How to create the type of a generic enum in Dart
  • Constrain a generic type to an Enum
  • Pass a Generic Enum argument to a method

Create a Generic Type Object Enum

Defined enum with generic and accepts String integer values

enum EmployeeEnum<T> {
  name<String>(),
  salary<int>();
}

void main() {
  print(EmployeeEnum.name.runtimeType); // EmployeeEnum<String>
  print(EmployeeEnum.salary.runtimeType); // AniEmployeeEnummal<int>
}

Another example, Generics are of the type that extends Objects. It accepts any type and added value with the constructor.

You can access the value of an enum using Enum.value

enum Week<T extends Object> {
  number<int>(1),
  name<String>('sunday'),
  isWorking(false);

  const Week(this.value);
  final T value;
}

void main() {
  Week week = Week.name;
  print(week.name.runtimeType); // String
  print(week.value); // sunday
}

Constrain a generic type to an Enum in Dart

Enum can be used as a constrained generic type to a class as a given example. the class accepts Enum constants only.

Here is an example

class WorkingDay<T extends Enum> {}

enum WEEK { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }

void main() {
  WorkingDay<WEEK> working = WorkingDay<WEEK>();
  print(working.runtimeType);
  print(working.toString());
}

Output:

WorkingDay<WEEK>
An instance of 'WorkingDay<WEEK>'

Pass a Generic Enum argument to a method

This example explains passing a Generic type enum constant to a function.

enum WEEK { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }

List<String> getEnumNames<T extends Enum>(List<T> values) =>
    [for (var e in values) e.name];

void main() {
  print(getEnumNames(WEEK.values));
}