如何在Dart中实现类似TypeScript的变量类型工厂类?
问题描述
我原本有一个TypeScript工厂类,尝试将其改写为Dart版本:
class FactoryClass{ factory FactoryClass(dynamic types, String className, dynamic defaultValue){ if(types[className] != null ){ return types[className](defaultValue); } else{ throw Exception(""); } } }
在TypeScript中它是这样使用的:
let variable= new FactoryClass([String, Number, etc...], "Number", "42")
该代码会返回一个值为42的Number类型变量。但在Dart中无法这样实现,因为Dart的类型没有对应的构造方式,比如不能执行final myString = new String("def_value")。请问我该如何在Dart中实现类似功能?
Dart实现方案
Dart的基础类型(如String、int、double)无法通过new Type(value)的方式实例化,必须使用类型自身的转换方法或字面量创建。我们可以通过维护类型名称与转换函数的映射表来实现类似的工厂逻辑:
核心实现代码
class FactoryClass { // 存储类型名称到转换函数的映射 static final Map<String, dynamic Function(dynamic)> _typeConverters = { 'String': (value) => value.toString(), 'int': (value) { final parsed = int.tryParse(value.toString()); if (parsed == null) throw FormatException('Failed to convert $value to int'); return parsed; }, 'double': (value) { final parsed = double.tryParse(value.toString()); if (parsed == null) throw FormatException('Failed to convert $value to double'); return parsed; }, // 可扩展添加自定义类型的转换逻辑 }; factory FactoryClass(String className, dynamic defaultValue) { final converter = _typeConverters[className]; if (converter != null) { return converter(defaultValue); } else { throw Exception('Unsupported type: $className'); } } // 可选:支持动态注册新类型 static void registerType(String className, dynamic Function(dynamic) converter) { _typeConverters[className] = converter; } }
使用示例
基础类型转换
void main() { // 转换为int类型 int number = FactoryClass('int', '42'); print(number); // 输出:42,类型为int // 转换为String类型 String str = FactoryClass('String', 123); print(str); // 输出:"123",类型为String // 转换为double类型 double decimal = FactoryClass('double', '3.14'); print(decimal); // 输出:3.14,类型为double }
扩展自定义类型
如果需要支持自定义类,只需注册对应的转换函数即可:
// 自定义类 class Person { final String name; Person(this.name); } void main() { // 注册自定义类型 FactoryClass.registerType('Person', (value) => Person(value.toString())); // 使用工厂创建自定义实例 Person person = FactoryClass('Person', 'Alice'); print(person.name); // 输出:Alice }
说明
- 相比TypeScript版本,Dart实现通过预定义/动态注册的转换函数替代了直接调用类型构造的逻辑,更符合Dart的类型系统规范。
- 转换函数中加入了错误处理,避免无效值导致的静默失败。
- 动态注册方法
registerType让工厂类具备了灵活扩展的能力。
内容的提问来源于stack exchange,提问作者Patrick Visi
相关产品推荐
相关产品推荐

