例如,我有這樣一個代碼:
interface Subscriber {
reviewData: string | string[]
hasArray: boolean;
}
const reviews = ["Good", "Not bad"];
const subscriber: Subscriber = {
reviewData: reviews,
hasArray: Array.isArray(reviews)
}
if (subscriber.hasArray) {
subscriber.reviewData.forEach(console.log);
} else {
console.log(subscriber.reviewData);
}
當然,TypeScript 會抱怨subscriber.reviewData.forEach(console.log);說它無法定義它是一個陣列還是一個字串,因為在 condition 中沒有足夠的型別保護subscriber.hasArray。
我不想總是寫Array.isArray(subscriber.reviewData),因為我會在很多其他地方使用這個邏輯。
我聽說過,is但在我的場景中并非如此,因為 usingis意味著您必須擁有一個函式并將一些引數傳遞給它。
我怎樣才能達到預期的效果?
uj5u.com熱心網友回復:
如果您希望能夠hasArray用作確定reviewData是 astring[]還是 a 的方法string,那么您確實希望Subscriber成為可區分的聯合型別而不是介面。您的界面將允許{reviewData: "", hasArray: true},因此編譯器無法排除這種可能性。使用有區別的聯合,您可以檢查一個區別屬性,以縮小整個物件的型別:
type Subscriber = {
reviewData: string[]
hasArray: true;
} | {
reviewData: string
hasArray: false;
}
在這種情況下hasArray,是布爾文字型別 true或的判別屬性false。
然后,給定一個Subscriber:
const subscriber: Subscriber = Math.random() < 0.5 ?
{ reviewData: "Good", hasArray: false } :
{ reviewData: ["Who", "Cares"], hasArray: true };
我們可以按照您想要的方式檢查它,而不會出現編譯器錯誤:
if (subscriber.hasArray) {
subscriber.reviewData.forEach(console.log);
} else {
console.log(subscriber.reviewData.toUpperCase());
}
Playground 代碼鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/414892.html
標籤:
上一篇:ArrayList內容超出范圍,并在Java中的While回圈后被洗掉
下一篇:將物件保存在陣列中
