Dart中的字符串文字类型(例如在TypeScript中)?

时间:2019-04-11 05:53:44

标签: typescript dart

感谢Flutter,我开始使用Dart,我非常喜欢这种语言。

我以前使用过TypeScript,它提供了一些以前从未见过的非常酷的功能,我特别喜欢的是string literal types,看起来像这样

type Easing = "ease-in" | "ease-out" | "ease-in-out";
function doSomething(easing: Easing) { /* do something */}
doSomething("ease-in");  // OK
doSomething("easy");  // ERROR

在Dart中,我发现使用enum有时会带来不便,尤其是在与特定于平台的插件实现进行交互时。每当我需要为Android的static Stringenum添加Dart接口时,我都会错过字符串文字类型。

其中一个example来自android_intent插件(但发生频率更高):

void _createAlarm() {
  final AndroidIntent intent = const AndroidIntent(
    action: 'android.intent.action.SET_ALARM',
    arguments: <String, dynamic>{
      'android.intent.extra.alarm.DAYS': <int>[2, 3, 4, 5, 6],
      'android.intent.extra.alarm.HOUR': 21,
      'android.intent.extra.alarm.MINUTES': 30,
      'android.intent.extra.alarm.SKIP_UI': true,
      'android.intent.extra.alarm.MESSAGE': 'Create a Flutter app',
    },
  );
  intent.launch();
}

在Dart中,有没有办法像TypeScript的字符串文字类型一样具有这些“魔术字符串”?

1 个答案:

答案 0 :(得分:0)

每个enum常量都会创建一个Enum实例,该实例具有一个toString()方法,该实例将返回一个带有enum类型名称和该常量名称的字符串。例如,给定:

enum MyEnum {
  myConstant,
}

然后MyEnum.myConstant.toString()将返回"MyEnum.myConstant"。尽管这不能让您轻松创建任意字符串,但是您可以执行以下操作:

enum alarm {
  DAYS,
  HOUR,
  MINUTES,
  SKIP_UI,
  MESSAGE,
}

void _createAlarm() {
  final arguments = <alarm, dynamic>{
    alarm.DAYS: <int>[2, 3, 4, 5, 6],
    alarm.HOUR: 21,
    alarm.MINUTES: 30,
    alarm.SKIP_UI: true,
    alarm.MESSAGE: 'Create a Flutter app',
  };

  final AndroidIntent intent = const AndroidIntent(
    action: 'android.intent.action.SET_ALARM',
    arguments: arguments.map((k, v) => MapEntry('android.intent.extra.$k', v)),
  );
  intent.launch();
}