typescript 3.2 新編譯選項strictBindCallApply

zhoutk發表於2019-02-16

突發錯誤

我的gels專案(https://github.com/zhoutk/gels),幾天沒動,突然tsc編譯出錯,資訊如下:

src/app.ts:28:38 - error TS2345: Argument of type `any[]` is not assignable to parameter of type `[Middleware<ParameterizedContext<any, {}>>]`.
  Property `0` is missing in type `any[]` but required in type `[Middleware<ParameterizedContext<any, {}>>]`.

28             m && (app.use.apply(app, [].concat(m)))

我的原始碼,是動態載入Koa的中介軟體,app是koa2例項

    for (let m of [].concat(middleware)) {
        m && (app.use.apply(app, [].concat(m)))
    }

問題分析

幾天前還是正常編譯、正常執行的專案,突然出錯,應該是環境變了。經查詢,發現全域性typescript已經升級到了最新版本,3.2.2,而專案中的版本是3.0.3。
將全域性版本換回3.0.3,編譯通過,問題找到。

問題定位

上typescrpt的github主頁,找釋出日誌,發現3.2的新功能,第一條就是:

TypeScript 3.2 introduces a new --strictBindCallApply compiler option (in the --strict family of options) with which the bind, call, and apply methods on function objects are strongly typed and strictly checked.

大概意思是:TypeScript 3.2引入一個新的編譯選項 –strictBindCallApply,若使用這個選項,函式物件的bind,call和apply方法是強型別的,並進行嚴格檢測。

解決方案

因為是動態引數,想了半天我沒法明確宣告型別。因此,我在tsconfig.json配置檔案中,設定”strictBindCallApply”: false,將這個編譯選項關閉,這樣就可以將typescript升級到3.2.2了。
哪位朋友若有能開啟strictBindCallApply選項,又能通過編譯的方案,煩請告知一下,謝謝!我若哪天找到方法,會馬上更新本文章。

相關文章