如何在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
相关产品推荐
相关产品推荐

