[英]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.