You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Dart中定义仅支持两种原始类型的变量(如String或num)

在Dart中实现类似TypeScript联合类型的两种原始类型限制

Dart本身没有像TypeScript那样原生支持string|number这种直接的联合类型语法,但可以通过以下几种方式实现类似的类型限制效果:

方法一:使用密封类(Sealed Class)实现类型安全的限制

这是最推荐的方式,能在编译阶段就确保变量只能接受指定类型,完全符合类型安全要求。

首先定义一个密封基类,再为每种允许的类型创建子类:

// 密封类,限制只能有指定的子类
sealed class StringOrNum {}

// 封装String类型的子类
class StringWrapper extends StringOrNum {
  final String value;
  StringWrapper(this.value);
}

// 封装num类型的子类
class NumWrapper extends StringOrNum {
  final num value;
  NumWrapper(this.value);
}

使用时,变量类型声明为StringOrNum,只能接受上述两个子类的实例:

void main() {
  StringOrNum x = StringWrapper("Hello"); // 合法
  x = NumWrapper(123.45); // 合法
  // x = true; // 编译报错,不允许传入bool类型
}

使用变量时,可以通过模式匹配(Dart 3.0+支持)安全地提取值:

void handleValue(StringOrNum value) {
  switch (value) {
    case StringWrapper(:final value):
      print("处理字符串: $value");
    case NumWrapper(:final value):
      print("处理数字: $value");
  }
}

方法二:使用Object类型配合运行时检查

这种方式更简单,但只有运行时检查,编译阶段无法拦截错误类型,适合快速实现但对类型安全要求不高的场景:

void main() {
  Object x = "Hello"; // 合法
  x = 123; // 合法
  // x = true; // 编译不会报错,但运行时处理会出问题

  // 使用时需要检查类型
  if (x is String) {
    print("字符串: $x");
  } else if (x is num) {
    print("数字: $x");
  } else {
    throw ArgumentError("x只能是String或num类型");
  }
}

方法三:使用dynamic类型(不推荐)

dynamic会完全关闭类型检查,虽然可以赋值任意类型,但完全失去了类型限制的意义,仅作为兜底选项:

dynamic x = "Hi";
x = 456;
// 但也可以赋值任意其他类型,无法限制

内容的提问来源于stack exchange,提问作者Jaafar Melhem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 20:02:07