【问题标题】:Constraint typedef to range of integer in Dart将typedef约束到Dart中的整数范围
【发布时间】:2022-12-10 17:56:54
【问题描述】:

我可以将 typedef 限制为 Dart 中的整数范围吗?

就像这个 TypeScript 中所示 SO answer

type MyRange = 5|6|7|8|9|10

let myVar:MyRange = 4; // oops, error :)

我想限制:

Dice dice = 0; // warning not compile
Dice dice = 1;
Dice dice = 2;
Dice dice = 3;
Dice dice = 4;
Dice dice = 5;
Dice dice = 6;
Dice dice = 7; // warning not compile

喜欢:

typedef Dice = 1|2|3|4|5|6

在 Dart 中有可能吗?

【问题讨论】:

  • 在 Dart 中不可能。如果您想将变量限制为一组有限的值,我会建议使用 enum 而不是。
  • Dart 并不真正支持这一点,但可以使用合适的类来完成。

标签: dart


【解决方案1】:

您可以创建一个类,该类采用一组允许的值并在将不在该集合中的值分配给其 value 成员时抛出异常:

class Restricted<T> {
  late final Set<T> _validSet;

  late T _value;

  Restricted(Set<T> validSet) {
    _validSet = Set<T>.unmodifiable(validSet);
  }

  T get value => _value;

  set value(T newValue) {
    if (!_validSet.contains(newValue)) {
      throw RangeError('$newValue is not a valid value');
    }

    _value = newValue;
  }
}

并像使用它

var r = Restricted<int>({1,2,3,4,5,6});

r.value = 2;  // Okay
r.value = 0;  // throws ValueError

请参阅DartPad 上的实际代码

【讨论】:

  • 那是在运行时。但我希望得到 IDE 警告而无法编译
  • @lolelo 对于编译时间,使用 Enum 类。
  • 你的意思是通用T作为枚举,还是类Restricted可以是枚举?
  • @lolelo 我的意思是按照预期的方式使用Enum:来自一组固定选项的值。由于 Dart 不支持受限标量 (int) 类型,这可能就是您需要的解决方案。它甚至提供了命名的、可打印的值的好处。查看:api.dart.dev/be/180791/dart-core/Enum-class.html
【解决方案2】:

您是在询问您想到的可能的解决方案,而不是分享实际问题。

如果您以更笼统的方式陈述您的实际问题,您可能会在这里找到更好的答案。也许 Enum 比受限制的 int 更合适。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多