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

izj3ouym  于 11个月前  发布在  TypeScript
关注(0)|答案(1)|浏览(117)

我开始使用Dart感谢Flutter,我很喜欢这门语言。
我以前使用过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 s有时不方便,特别是在与特定于平台的插件实现交互时。每次我需要为Android的static String s或enum s添加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的字符串文字类型那样拥有这些“魔法字符串”?

bq3bfh9z

bq3bfh9z1#

Dart enum常量有一个name扩展名,它返回一个带有常量名称的字符串。例如,给定:

enum MyEnum {
  myConstant,
}

字符串
那么MyEnum.myConstant.name将返回'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: {
      for (var MapEntry(:key, :value) in arguments.entries)
        'android.intent.extra.alarm.${key.name}': value,
    },
  );

  intent.launch();
}

相关问题