我正在使用flow-runtime
babel
插件生成动态类型化的javascript代码。以下是我正在使用的工作流程
编写静态javascript代码(带流程注释)
使用babel编译此代码以将流注释转换为类型代码
在node.js
以下工作流程使我能够编写打字稿类型代码,但只能在我想要的地方进行类型检查。
所以,既然我们明白自己在做什么,那就让我解释一下我想要实现的目标
我基本上需要构建一个名为Interface
的类,它会完全听起来像它。这个类将由应该是接口的类扩展,然后由其他类扩展。像这样:
class Interface() {
constructor() {
...
}
// interface superclass, supposed to be extended by all interfaces
// this class will provide all the utility methods required
// by an interface, such as validating the implementation of the
// interface, ...
validateInterfaceImplementation() {
...
}
}
// interface definition
class FooInterface extends Interface {
constructor() {
super();
...
}
}
// actual class, that will implement the "FooInterface" interface
class Foo extends FooInterface {
constructor() {
super();
...
}
}
现在,我想强制执行FooInterface
的严格执行。这意味着我想要一种方法来定义FooInterface interface
期望实现的所有方法,并验证所有这些方法是否由Foo
类实现。
我尝试的内容看起来像这样
// interface.js
// @flow-runtime
class Interface<T> {
constructor(t: T) {
(this: T); // let flow validate that the interface is implemented
}
}
// FooInterface.js
// @flow-runtime
type foInterface = {
bar(param: string): number;
}
class FooInterface extends Interface<fooInterface> {
constructor() {
super(fooInterface);
}
}
// Foo.js
// @flow-runtime
class Foo extends FooInterface {
}
new Foo(); // should throw an error, because the interface is not implemented
// (the function bar is not defined)
我遇到了这种方法的多个问题
Interface<T>
。我认为我的实现是不正确的,编译后的babel代码也会引发错误,但我无法弄清楚如何执行此操作。欢迎任何帮助。在此先感谢:)
答案 0 :(得分:1)
从流运行时0.5.0开始,您可以将Flow的implements
关键字与Flow接口结合使用。我认为这将为您提供您想要的东西而无需创建具体的类:
// @flow
// @flow-runtime
interface IPoint<T> {
x: T;
y: T;
}
interface IJSON {
toJSON (): any;
}
class Point implements IPoint<number>, IJSON {
x: number = 123;
y: number = 456;
toJSON () {
return {x: this.x, y: this.y};
}
}