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

