簡體   English   中英

創建使用流類型並公開類型的JS庫

[英]Creating JS library that uses flow type and exposes types

我正在寫一個供第三方使用的庫。 我選擇flowtype作為打字系統(由於我的組織而有特定原因)。 該庫公開了帶注釋的React組件。

該庫使用flowtype進行注釋。 我還希望能夠在具有flowtype的其他代碼中使用它。 我在庫中創建了index.flow.js ,並在其中添加了以下內容:

// @flow

import type MyComponent from './components/my-component'

export default MyComponent

// some other types follow
...

當我嘗試在其他代碼庫中使用該庫時,類型“不起作用”。 例如,如果我將無效的prop傳遞給組件,則類型系統不會引發任何錯誤。 我的代碼庫也是使用flowtype鍵入的。

我應該在庫的index.flow.js文件中的組件中聲明我的React嗎? 這似乎很尷尬,因為現在我必須在兩個位置(組件本身和流文件)維護類型。

我認為默認情況下該流程有效。 由於我的React組件是類型化的,並且庫正在公開index.flow.js因此可以識別出該組件具有道具,狀態等的特定類型,但實際上沒有。

因此,經過一些研究,我得出的結論是,有兩種方法:

1.公開單一定義文件

確保創建與分發JS文件名相同的定義文件。 這意味着,如果您具有帶有捆綁文件lib-a.jslib-a ,則將定義文件命名為lib-a.js.flow 請遵循Flow文檔中有關如何正確定義模塊的庫定義的信息。

使用這種方法,您需要在其中聲明整個模塊。 這意味着,如果您有類MyComponent ,則需要在此處再次定義它。

我不喜歡這種方法,因為一切都需要放在一個地方。 然后,在源代碼中,您需要從定義文件中導入類型,以免最終避免重復類型定義。 這不是很好,例如,使用React最終從主定義文件中導入Props類型,這會使它的可讀性降低,而不是直接插入類型。 我猜這種方法對小型圖書館可能很好。

2. 使用源文件.flow后綴

使用這種方法,您基本上可以將所有未編譯/未捆綁的源代碼復制到分發文件中。 這些文件將以*.flow擴展名結尾,這意味着Flow只會將它們用於類型分析。 閱讀這篇文章如何得到它的工作。

簡而言之,您基本上是:

  1. flow-copy-source安裝為dev依賴項
  2. 將此添加到package.json

     "build:flow": "flow-copy-source -v -i '**/__tests__/**' src lib" 

    其中src是源代碼的文件夾, lib是最終被使用的分發文件的文件夾(可能在npm存儲庫中)。

有人可能會認為這種方法是“駭人的”,並且會污染分發程序包。 我同意,這不是很干凈的解決方案,但可能是到目前為止找到的最好的解決方案。 請閱讀提供的文章和評論,以進一步了解您可以做什么。

即將到來的更改(?)

我遇到了這個Github線程 ,正在討論這個確切的問題。 似乎gen-flow-files即將被刪除,我目前使用的方法是前進的道路。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM