Flow技术问题:如何声明变量为实现接口的构造函数?
解决Flow中声明“实现指定接口的构造函数”变量的问题
我完全懂你遇到的困扰——你想让变量指向一个能创建Foo接口实例的构造函数,但当前的类型标注(() => Foo)并不符合Flow对构造函数类型的预期对吧?
问题出在哪?
你写的(() => Foo)表示的是一个无需参数、调用后直接返回Foo实例的普通函数,但Bar是个类构造函数,必须用new关键字调用才能生成实例,两者的类型本质上不匹配,所以Flow会报错。
正确的实现方式
Flow专门提供了Class<T>类型来表示“能构造出T类型实例的构造函数”,直接用它来标注你的变量就可以了:
interface Foo { bar(): void; } class Bar implements Foo { bar(){} } const constructor: Class<Foo> = Bar; // 现在类型匹配了!
进阶:带参数的构造函数
如果你的构造函数需要接收参数,还可以通过Class<T, Args>的形式,第二个泛型参数传入构造函数的参数数组类型,让Flow帮你检查参数是否合规:
interface Foo { bar(): void; } class Bar implements Foo { bar(){} constructor(name: string, age: number) {} } // 标注构造函数需要(string, number)两个参数 const constructor: Class<Foo, [string, number]> = Bar; // 调用时Flow会校验参数类型和数量 const instance = new constructor("Alice", 28); instance.bar(); // 完全没问题
这样写不仅能让Flow正确识别构造函数的类型,还能在后续调用时提供完整的类型检查,完美满足你的需求~
内容的提问来源于stack exchange,提问作者user578895
相关产品推荐
相关产品推荐

