有沒有辦法在不使用@ts-ignore打字稿的情況下使用具有物件屬性的陣列
假設我有這個函式,它嘗試將陣列轉換為具有 prop 屬性的陣列。這作業正常,除了他們是@ts-ignore
const addPropToArray = <T extends unknown>(x: T[]): T[] & {prop: number} => {
//@ts-ignore
const y: T[] & {prop: number} = [...x];
y.prop = 3;
return y
};
顯然我不能這樣做
const x: string[] & {prop:number} = // what could go here
就其本身而言,這就是為什么我正在考慮使用該函式,但即使如此,該函式也必須有一個@ts-ignore.
具有物件屬性的陣列是一個壞主意,打字稿沒有試圖很好地支持它們,還是它們是我遺漏的東西?
也許他們是可以作業的一些變體?
const x: string[] & {prop:number} = {...["a","b","c"], prop: 4}
顯然這里的問題是它不再是一個陣列。
編輯:我意識到我可以只使用值而不是使用值,@ts-ignore但那個基石似乎不是最好的解決方案
uj5u.com熱心網友回復:
顯然我不能這樣做
const x: string[] & {prop:number} = // what could go here
如果您分配自執行匿名函式的回傳值,您可以這樣做。像這樣的東西,例如:
interface ArrayProps {
prop: number;
}
const x: string[] & ArrayProps = (() => {
const xPartial: string[] & Partial<ArrayProps> = [];
xPartial.prop = 3;
return xPartial as string[] & ArrayProps;
})();
打字稿游樂場
不過,我不確定是否有辦法在沒有型別斷言的情況下做到這一點。添加自定義型別保護而不是型別斷言將需要考慮型別保護失敗的路徑,因此x最終也能夠成為undefined或取決于該路徑的處理方式。
uj5u.com熱心網友回復:
該Object.assign(target, source)方法將可列舉自己的屬性從source物件復制到target物件上并回傳增強的target. 此方法的 TypeScript標準庫型別如下所示:
interface ObjectConstructor {
assign<T, U>(target: T, source: U): T & U;
}
這意味著它將操作建模為產生 的型別和原始型別的交集,這正是您正在尋找的!sourcetarget
所以你可以這樣寫addPropToArray():
const addPropToArray = <T extends unknown>(x: T[]): T[] & { prop: number } => {
return Object.assign([...x], { prop: 3 });
};
沒有型別斷言或//@ts-ignore注釋。
請注意,如果您確實必須在型別斷言 和 之間進行選擇//@ts-ignore,請選擇型別斷言。它們都具有阻止錯誤的能力,但都不安全。但是型別斷言的范圍是有限的,它告訴編譯器將某個值視為某種型別,而//@ts-ignore只是抑制錯誤訊息,并且可能會產生奇怪的非區域副作用。使用型別斷言就像按下煙霧探測器上的“暫時安靜”按鈕,這樣您就可以安心地做飯了,而使用//@ts-ignore則就像完全卸下煙霧探測器的電池。
無論如何,讓我們確保它有效:
const z = addPropToArray(["a", "b"]);
console.log(z) // ["a", "b"]
console.log(z.prop) // 3
看起來挺好的。
Playground 鏈接到代碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/346679.html
標籤:数组 打字稿 javascript对象
下一篇:如何在C 中打亂陣列?
