使用flow-runtime在Javascript中实现接口

时间:2017-02-06 05:41:25

标签: javascript inheritance interface babel

我正在使用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代码也会引发错误,但我无法弄清楚如何执行此操作。
  • 我甚至不确定这种方法是否有效,或者这是否是解决此问题的最佳方法。

欢迎任何帮助。在此先感谢:)

1 个答案:

答案 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};
  }
}