如何编写类工厂的声明,例如 Backbone 模型?

gopyfrb3  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(132)

通过谷歌搜索和阅读Flow文档和示例,没有发现Javascript中一个非常常见的模式. -具有返回类的函数。

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中正确注解这个模式?

4dc9hkyq

4dc9hkyq1#

/* @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 typegeneric type来表达这样的模式:“给定一个定义对象类型T,返回一个同时为ModelTClass
此代码在brew-shipped流0.11下编译
下面是我个人对flow的看法。我不得不承认flow文档是稀缺的。了解它的特性的最好方法可能是阅读flow的React annotation and flow's source. Flow基于一个复杂的类型推理算法,它允许你在没有注解的情况下对程序进行类型检查。所以Flow的设计是为了让你不需要注解,它的文档也是如此。然而,类型推断并不高级到使人免于注解。2你的代码就是一个例子。

相关问题