很多第三方庫已經有自己的型別宣告檔案,比如@types/react,@types/react-native,這些需要單獨安裝,而例如mobx-react和mobx這種會自帶型別檔案,不需要單獨安裝。
我們最近有個新專案,需要照顧到不同同學,有的願意用ts,有的不想用ts,為了照顧到雙方,所有的公共模組都是js寫的,所以需要單獨為ts寫型別宣告檔案,具體語法請參考ts官網的文件,這裡只是講一些坑。
集中管理,相對路徑匯入
為專案中的js寫型別檔案的時候,需要先引入對應的檔案,然後以匯入的路徑為名字宣告乙個模組,最後在需要用到這個型別檔案的地方用///來引入相對路徑。
目錄結構如下:
- @types
- basepage.d.ts
- src
- frame
- basepage.js
- page
- hotellist
- index.tsx
型別宣告檔案:
// basepage.d.ts
import basepage from '../src/frame/basepage'
declare module "../src/frame/basepage"
}
引入型別檔案:
// index.tsx
///
如果是想設定全域性的型別檔案,可以在tsconfig.json的paths欄位裡面指定對應的路徑,這樣就不需要單獨用reference引入了。
自動匯入
上面那種方法雖然可以將types檔案集中管理,但是有個很麻煩的地方就是需要在引入basepage模組的地方手動引入d.ts檔案,這個真的很繁瑣,這裡有個更好的方法。
- src
- frame
- basepage.js
- basepage.d.ts
- page
- hotellist
- index.tsx
index.tsx檔案直接import匯入basepage就行了,不需要再專門引入basepage.d.ts,這裡兩者命名一樣,所以會自動識別basepage.d.ts,但是basepage.d.ts的語法也變化了一些。
// basepage.d.ts
// 注意:這裡不需要再宣告declare module "basepage"了,否則會識別不了
export default class basepage{}
class pageflag
}
這裡我希望能夠更新pageflag中的資料,但是又不想對所有的屬性一一枚舉出來,但是由於沒有設定this[name]的型別,導致了報錯,這裡有幾種解決辦法。
(1) 修改tsconfig.json裡的noimplicitany為false。
(2) 給this設定型別,但是不好的地方就是失去了型別判斷的意義,如下:
// 例2
inte***ce iparams
class pageflag
}
(3) 手動列舉所有屬性
雖然這樣比較麻煩,但是一眼就能看出來pageflag有哪些屬性,資料比較清晰。
type pageflag = "showloading" | "showmask" | "showcalendar";
class pageflag
}
// 我們有個components資料夾,下面有很多元件檔案(都是export default匯出的),我們可以components下建立index.ts檔案,裡面這麼寫(下):
export hotel from './hotel'
export * as hotellist from './hotellist'
export header from './header'
但是這兩種export from的方式在ts裡面都會編譯報錯,可是我在es6裡面明明寫的好好的啊!!!
後來在google上找到了乙個鏈結,原來這兩種export from的方式都只是提案,如果在es6中則需要額外新增@babel/plugin-proposal-export-namespace-from 外掛程式來支援,ts中不支援這些寫法。
但是感覺這個更像野路子,也許未來會支援,遂放棄,最後發現了另外一種寫法,可以完美解決這個問題。
export from './hotel'
export from './hotellist'
export from './header'
順便說一下,export from其實還有下面兩種寫法,但是這兩種寫法都是需要模組export匯出,而不是export default匯出的。
export from './hotel'
export * from './hotel
踩過的坑,持續更新
1 top竟然是dom中的保留字,和window乙個型別的東西,當初還很2b的設定var top 2 innerhtml的問題,在xhtml中要求符合標準格式才能成功,比如我遇到的是在乙個p元素中,再插入p就是非法的。還要注意ie下面的某些元素唯讀,如等。3 偷懶用var a b c null 會怎...
python踩的坑(持續更新)
使用threadpoolexecutor執行緒池,並使用submit提交呼叫函式 開始呼叫寫法 from concurrent.futures import threadpoolexecutor from concurrent import futures pool threadpoolexecut...
SQL踩坑集合,持續更新
1.oracle中null資料的計算 select count from pier.testxhh t where t.name a 結果 0 select count from pier.testxhh t where t.name a 結果 1 select count from pier.te...