【问题标题】:String Literal Types (like in TypeScript) in Dart?Dart 中的字符串文字类型(如 TypeScript 中的)?
【发布时间】:2019-04-11 05:53:44
【问题描述】:

感谢 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 中,我发现使用 enums 有时不方便,尤其是在与特定于平台的插件实现交互时。每次我需要为 Android 的 static Strings 或 enums 添加 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 的字符串文字类型一样?

【问题讨论】:

    标签: typescript dart


    【解决方案1】:

    每个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();
    }
    

    【讨论】:

      猜你喜欢
      • 2017-03-31
      • 2019-11-06
      • 1970-01-01
      • 2017-11-13
      • 1970-01-01
      • 2017-08-24
      • 2023-03-21
      • 1970-01-01
      • 2016-08-31
      相关资源
      最近更新 更多