網站搜尋

Typescript 所有 lodash/fp 的返回類型都是 any


我已在一個 TypeScript 專案中安裝了:

"@types/lodash": "4.14.150",
"loadash": "4.17.15",

所有資料,當透過 lodash/fp 處理時,都會以 any 的形式返回

以下程式碼不會報告任何錯誤:

import {prop} from 'lodash/fp';


const data: { id: string } = { id: 'hello' }

// from the above we know that id is a string, but typing it as a number doesn't report any errors
const meh: number  = prop('id')(data) 

在不加上 number 類型的情況下,我可以看到返回類型是 any

我可以怎麼修好這個,謝謝?

答案#1

根據 TypeScript 的型別定義,prop() 的單一字串參數形式是:

(path: lodash.PropertyPath): LodashProp8x1;

而 LodashProp8x1 是:

interface LodashProp8x1 {
    (object: null | undefined): undefined;
    (object: any): any;
}

所以 prop('id') 返回一個函數,該函數要麼返回 undefined,要麼返回 any。

看起來官方的型別定義並不支持以型別安全的方式從這個調用簽名中提取 props。

如果你使用其中一個具有兩個參數的通用形式,並且它的作用如你所預期:

const meh: number = prop('id', data)
// Type 'string' is not assignable to type 'number'

或者看起來對於這兩個函數語法有一個通用形式,但你必須事先告訴編譯器你打算使用的物件類型:

const meh: number = prop<typeof data, 'id'>('id')(data)
// Type 'string' is not assignable to type 'number'