TypeScript踩坑(持續更新)

2021-09-13 07:44:09 字數 2657 閱讀 1293

很多第三方庫已經有自己的型別宣告檔案,比如@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...