簡體   English   中英

為 find 方法縮小集合和數組的聯合類型

[英]Narrowing Union Type of Set and Array for find method

我有以下數據 model

一個人的每日數據

interface FetchDocument {
    Date : number,
    Hours : number,
}   

這些數據的集合

type Data_Array = Set<FetchDocument> | FetchDocument[]

interface GroupDocument {
    name : string,
    Data : Data_Array,
   
}

測試的樣本數據如下

let fetchArray : GroupDocument[] = [
    {
        name : 'John',
        Data : [
            {
                Date : 13,
                'Hours' : 14
            },
            {
                Date : 12,
                'Hours' : 433
            }
        ] 
    }
]

當我想使用 find 方法在該樣本上查找時

for(let i= 0; i < fetchArray.length ; i++){
    let obj = fetchArray[i].Data.find((obj : FetchDocument) => obj.Date ===  13 )
}

由於 Data_Array 上的設置類型,編譯器如下抱怨。

錯誤 TS2339:屬性“查找”在類型“Data_Array”上不存在。

類型“Set”上不存在屬性“find”。

所以我嘗試的是嘗試縮小或重新分配以通過三種方式解決

收窄

 if(Array.isArray(fetchArray[i].Data)){
        let obj = fetchArray[i].Data.find((obj : FetchDocument) => obj.Date ===  13 )
 }
 if(typeof(fetchArray[i].Data.find) === 'function'){
        let obj = fetchArray[i].Data.find((obj : FetchDocument) => obj.Date ===  13 )
    }
   if(fetchArray[i].Data instanceof Array){
        let obj = fetchArray[i].Data.find((obj : FetchDocument) => obj.Date ===  13 )
    }

重新分配給數組

fetchArray[i].Data = [...fetchArray[i].Data] 
let obj = fetchArray[i].Data.find((obj : FetchDocument) => obj.Date ===  13 )
fetchArray[i].Data = Array.from(fetchArray[i].Data.values())
let obj = fetchArray[i].Data.find((obj : FetchDocument) => obj.Date ===  13 )

但是錯誤無法解決,所以我該怎么做才能解決它。

游樂場鏈接: 鏈接

在獲取數據時使用 Set 來檢測重復數據,因此更改它會導致更改代碼庫其他部分的代碼

在這種情況下您可能需要使用Type Assertions ,但如果數據不是數組,它會在runtime導致錯誤,這就是為什么您還應該注意runtime errors

這是你如何做到這一點,


for(let i= 0; i < fetchArray.length ; i++){
    // treat data as a FetchDocument[] type note! it can be another type on run time
    const data = fetchArray[i].Data as FetchDocument[] 
    // consider use error handling here
    let obj = data.find((obj : FetchDocument) => obj.Date ===  13 )
}

演示

更新

您也可以使用Array.from方法而不添加任何額外的if

for(let i= 0; i < fetchArray.length ; i++){
    let obj = Array.from (fetchArray[i].Data)
     .find((obj : FetchDocument) => obj.Date ===  13 )
}

這是由於我們所說的Temporal Uncertainty Typescript 不知道是否有任何其他代碼更改了fetchArray的內容,這可能導致在執行代碼時產生不同的值。

不需要任何顯式類型斷言,只需在驗證后立即將要檢查的值保存在另一個變量中

for (let i = 0; i < fetchArray.length; i++){
    let arr = fetchArray[i].Data;
    if (arr instanceof Array) {
        let obj = arr.find((obj : FetchDocument) => obj.Date === 13)
    }
}

暫無
暫無

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

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