Flowtype - 如何为类工厂编写声明,例如Backbone Models?

Mar*_*nec 6 javascript backbone.js flowtype

通过Flow文档和示例进行广泛的Google搜索和阅读并没有显示Javascript中非常常见的模式的任何示例 - 具有返回类的函数.一个典型的例子是Backbone:

var User = Backbone.Model.extend({
  getFullName: function() {
    return this.get('firstName') + ' ' + this.get('lastName');
  }
});  


var exampleUser = new User();
exampleUser.set('firstName', 'Johny'); //set() is a method from Backbone.Model
exampleUser.set('lastName', 'Something');
exampleUser.getFullName(); //method coming from User class
Run Code Online (Sandbox Code Playgroud)

在JSDoc中,我可以按如下方式对类进行注释,一些IDE能够找到一个不错的自动完成:

/**
 * @class User
 * @augments Backbone.Model
 */
var User = Backbone.Model.extend(/**@lends User.prototype */{
  getFullName: function() {...}
});
Run Code Online (Sandbox Code Playgroud)

有没有办法在Flow中正确注释这个模式?

Her*_*lme 8

/* @flow */

class Model {
    get(name: string): any {}
    set(name: string, value: any): void {}
}

function extend<T>(def: T): Class<Model & T> {
    throw new Error('not implemented')
}

var User = extend({
    getFullName: function() {
        return this.get('firstname') + this.get('lastname')
    }
})

var a = new User

a.get('firstname')
a.getFullName()
// a.notExisting give error
Run Code Online (Sandbox Code Playgroud)

我用交集型通用型表达模式是" 给定一个定义对象类型T,返回一个ClassModelT "

此代码在brew-shipped flow 0.11下编译


以下是我对流程的个人想法.我必须同意流程文档很少.学习其功能的最佳方法可能是阅读流的React注释和流的源.Flow基于复杂的类型推理算法,允许您在没有注释的情况下对程序进行类型检查.因此Flow旨在使您不进行注释,其文档也是如此.但是,类型推断不是那么先进,以免注释.你的代码就是一个例子.