2015-10-08 79 views
6

大量的使用Google和閱讀Flow文檔和示例沒有顯示任何JavaScript中常見模式的示例 - 具有返回類的函數。一個典型的例子就是骨幹:Flowtype - 如何編寫類工廠的聲明,如骨幹模型?

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中註釋這個模式?

回答

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 

我用路口型和通用型來表達模式「給出一個定義對象類型T,返回ClassModelT

此代碼在BREW的運編譯流量0.11


以下是我個人關於流量的想法。我必須同意流程文檔很少。瞭解其功能的最佳方式可能是讀取流程的React annotation and flow's source.流程基於複雜的類型推斷算法,該算法允許您在不進行註釋的情況下鍵入檢查程序。所以Flow的設計是爲了讓你不用註釋,它的文檔也是如此。但是,類型推斷並沒有如此先進以將其從註釋中解放出來。你的代碼就是一個例子。

+1

只是一個小的nit:Flow不使用H-M類型推斷。它使用流量分析(因此,流量)。感謝您提供這個答案! –

+0

@SamGoldman感謝您的糾正!更新了答案。 –