如何用Dart的typedef定义与TS泛型foo<A>结构一致的Map类型?
Dart 对应TS泛型对象类型的typedef实现
你给出的TypeScript泛型类型是固定包含val、fns两个字段的结构化对象,Dart中不推荐用Map实现该结构——Map是动态键值对结构,无法对固定字段做静态类型约束,不同场景的对应实现如下:
Dart 3.0+ 推荐写法(和TS结构完全对齐)
Dart 3.0 及以上版本支持的Record类型可以完美对标TS的对象字面量类型,泛型typedef写法为:typedef Foo<A> = ({ A val, List<void Function(A)> fns, });类型对应关系:
- TS的
Array<T>对应 Dart的List<T> - TS的
(a: A) => void对应 Dart的void Function(A)
该写法支持完整的静态类型检查,使用示例:
final demo: Foo<String> = ( val: "test", fns: [ (item) => print(item.length) ] );- TS的
强制使用Map类型的写法(不推荐)
如果业务场景必须使用Map结构,只能做通用键值类型约束,无法强制要求Map必须存在指定字段、也无法做严格的泛型关联校验,写法为:typedef Foo<A> = Map<String, dynamic>;该写法下你需要自行做运行时的字段存在性、类型校验。
Dart 3.0以下版本兼容写法
低于3.0的Dart版本没有Record类型,推荐用抽象类定义类型接口,类型安全性远高于Map:abstract class Foo<A> { A get val; List<void Function(A)> get fns; }
内容的提问来源于stack exchange,提问作者SmoothTraderKen
相关产品推荐
相关产品推荐

