2016-10-19 21 views
1

我在b.js文件中定義了一些類(在本例中它被命名爲B),它的聲明在b.js.flow文件中定義。我認爲流動型類與它的聲明相關聯,但不幸的是,當我嘗試使用一些功能,它接受B類裏面的方法流動型的情況下提出以下錯誤:Flowtype類聲明與它的實現不兼容

b.js:9 
    9:  return this.a.foo(this) 
       ^^^^^^^^^^^^^^^^ call of method `foo` 
    5: export default class B { 
         ^B. This type is incompatible with 
    6: foo(b: B): null; 
      ^B. See: a.js.flow:6 

我猜它是由treating classes as nominal types引起。有沒有辦法將類的實現與它的聲明聯繫起來以防止這個錯誤?

還有我已經用於測試文件的全部內容:

a.js:

// @flow 

import type B from './b' 

export default class A { 
    foo(b: B) { 
    return null 
    } 
} 

a.js.flow:

// @flow 

import type B from './b' 

declare export default class A { 
    foo(b: B): null; 
} 

b.js:

// @flow 

import A from './a' 

export default class B { 
    a: A; 

    bar() { 
    return this.a.foo(this) 
    } 
} 

b.js.flow:

// @flow 

import type A from './a' 

declare export default class B { 
    a: A; 
    bar(): null; 
} 

回答

1

.js.flow文件不適合坐並排側與他們同行.js如果.js文件也由流動檢查。其目的是使人們能夠通過以下方式在npm上發佈流類型聲明:(a)將原始源文件進行轉譯,以便人們可以在沒有自己的轉碼步驟的情況下運行它們;(b)將擴展名添加到原始源文件中,類型,所以Flow可以檢測。 flow-typed由於各種原因比這種方法更可取,但這是一個單獨的問題。

.js.flow文件是而不是意思是用作.h樣式的聲明文件。最有可能的是,最好的解決方案是簡單地刪除.js.flow文件。當我在沒有.js.flow文件的情況下測試你的例子時,它被檢測得很好。

相關問題