通过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
在JSDoc中,我可以按如下方式对类进行注释,一些IDE能够找到一个不错的自动完成:
/**
* @class User
* @augments Backbone.Model
*/
var User = Backbone.Model.extend(/**@lends User.prototype */{
getFullName: function() {...}
});
有没有办法在Flow中正确注释这个模式?
答案 0 :(得分: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
我使用intersection type和generic type来表达'给定定义对象类型T
的模式,返回Class
同时为Model
}和T
'
此代码在brew-shipped flow 0.11下编译
以下是关于流程的个人想法。我必须同意流程文档很少。学习其功能的最佳方法可能是读取流程React annotation and flow's source. Flow基于复杂的类型推理算法,它允许您在没有注释的情况下对程序进行类型检查。因此Flow旨在使您不进行注释,其文档也是如此。但是,类型推断不是那么先进,以免注释。您的代码就是一个例子。