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

Dart中如何在构建时获取构造函数的类型定义?

问题说明

假设我有如下定义的类:

class Foo {
   String bar;
   Foo(this.bar);
}

我们可以创建一个接收该构造函数作为参数的函数,写法如下:

Foo Function(String) test(Foo Function(String) constructor) => constructor('hello');
test(Foo.new); 

但这种写法十分冗余(若构造函数包含大量参数时冗余问题会更明显)。请问是否有方法可以获取Foo构造函数的类型别名,实现类似如下的写法?

(TypeOf<Foo.new> constructor) test => constructor('hello');
test(Foo.new);
解答

Dart 目前原生不支持TypeOf<Foo.new>这种直接提取构造函数类型的语法,不过用官方提供的typedef类型别名就能完美解决类型签名重复书写的冗余问题,类型校验完全准确,也没有任何额外运行时开销。

你只需要提前给对应构造函数的签名定义一次别名即可:

// 定义匹配Foo默认构造函数签名的类型别名
typedef FooConstructor = Foo Function(String);

之后所有需要接收这个构造函数的位置,直接用别名声明类型就行,不用反复手写返回值、参数列表:

Foo test(FooConstructor constructor) => constructor('hello');

void main() {
  // 调用方式和之前完全一致
  final foo = test(Foo.new);
  print(foo.bar); // 输出 hello
}

如果类有多个签名不同的命名构造函数,按需给对应签名定义typedef就可以,同签名的构造函数(不管是当前类的命名构造,还是其他类的同签名构造)都可以复用同一个别名。
哪怕构造函数有十多个参数,你也只需要在写typedef的时候写一次参数列表,后续所有用到这个构造函数类型的地方直接用别名,冗余问题完全解决,实际使用体验和你预期的TypeOf<Foo.new>写法没有区别。
目前Dart的语言提案里也没有加入构造函数typeof操作符的明确计划,typedef是官方推荐的标准实现方案,所有Dart版本都兼容,可读性也更好。


内容的提问来源于stack exchange,提问作者R W

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:21:18