2016-11-14 62 views
1

我想流添加註解簡單的克隆功能,它看起來並不可能目前。下面是一個嘗試:如何流程註釋克隆功能?

// @flow 
var clone = function<T>(obj: T): T { 
    if (Array.isArray(obj)) { 
     return obj.map(clone); 
    } 
    if (obj && typeof obj === 'object') { 
     var value = {}; 
     for (var i in obj) { 
      value[i] = clone(obj[i]); 
     } 
     return value; 
    } 
    return obj; 
} 

我使用泛型類型T來表示返回類型是相同的輸入類型。然而,返回以下錯誤:

11:   return value; 
        ^^^^^ object literal. This type is incompatible with the expected return type of 
2: var clone = function<T>(obj: T): T { 
      ^some incompatible instantiation of `T` 

在目標代碼分支,流量知道,返回類型T將是一個對象 - 爲什麼不能像一個對象文本兼容呢?如果不能,我該如何對此進行恰當的註釋?

我可以在此分支中添加(value: any),但在這種情況下Flow覆蓋率將不會滿(抱怨any)。

+0

這不完全是一個答案,但在我看來,不值得花費大量時間試圖正確地檢查這樣的功能。漸進式系統的美妙之處在於您可以挑選並選擇應用它們的位置。這樣的小功能可以很容易地被人類理解,並且很容易測試。在我看來,typecheckers在適用於人類無法輕易理解的大型系統時會大放異彩。只要你有正確的註釋界面(你可以),寫一些測試,然後繼續。 –

回答

1

爲了使這項工作,你必須證明對流量變化value確實具有類型T

首先,您的實現顯然並不對每一個可能的T工作。原型怎麼樣?那麼不可枚舉的屬性呢?什麼內建命令,像DateRegExp等?公平地說,即使你將在每一個可能的細節上實現克隆,Flow都將無法看到它,這太複雜了。

當你想利用Javascript的活力是這樣一種方式,你很可能不得不放棄類型安全實施。