我遇到了一個場景,我希望得到以下型別的執行:
我希望型別MyArrayType是一個陣列。
我希望型別MyArrayType是一個物件的陣列。物件中的欄位對于陣列中的每個物件索引必須是相同的,但是 "陷阱 "是我事先不知道這些欄位。我希望它們能夠被 "推斷 "出來。
下面是一個關于如何打字的例子:
const myArrayType: MyArrayType = [{ foo: 2 }, { foo: 1 }] //這將作業。
const myArrayType: MyArrayType = [{ foo: 2 }, { bar: 1 }] //這將會失敗。
const myArrayType: MyArrayType = [{ bar: 2 }, { bar: 1 }] //這將作業。
const myArrayType: MyArrayType = [{ anyFieldName: 2 }, { anyFieldName: 1 }] // this will work
const myArrayType: MyArrayType = [{ bar: 2, foo: 1 }, { bar: 1, foo: 2 }] //this will work[/span
const myArrayType: MyArrayType = [{ bar: 2, foo: 1 }, { bar: 1 }] //這將會失敗。
以下內容也應該失敗:
const myArrayType: MyArrayType = [1,2, 3]。 map((number) =>/span> {
if (number == 2) {
return {
foo: 1
bar: 2
}
}
return {
bar: 2
}
})
這樣做應該可以:
const myArrayType: MyArrayType = [1,2, 3]。 map((number) =>/span> {
return {
foo: 1 foo.
bar: 2
}
})
從2021年開始,這是否可以用typescript實作?
額外的限制:
- 編譯時檢查。運行時檢查是有用的,但不是必須的。
- 封裝函式和幫助器是可以的。
- 事實上,該函式也應用了多余的屬性檢查,如果超出第一個值的意外的額外屬性出現,則會拋出錯誤。
uj5u.com熱心網友回復:
你可以用這個通用函式來表達第一部分的內容:
function check< T1, T2 extends T1> (t1: T1, . ...tRest: T2[])。) T1[] {
return [t1, ...tRest];
}
//接受整個陣列,由Jeff Mercado提供(謝謝你!)。
function checkArray<T1, T2 extends T1>(arr: [T1, ...T2[])。T1[] {
return arr;
}
就map而言,TypeScript正確地推斷了回呼函式的聯合回傳型別。您的最佳選擇可能是通過將型別強制為never來 "禁止 "聯合,正如您可以使用現有的工具,如Titian Cernicova-Dragomir 的這個例子:
type UnionToIntersection< U> =
(U extends any ? (k: U)=>void : never) extends ((k: infer I)=> void)
? I : never
型別 NoUnion<Key> =
//如果這是一個簡單的型別UnionToIntersection<Key>將是相同的型別,。
//否則它將是聯盟中所有型別的交集,并且可能是
// will not extend `Key`。
[Key] extends [UnionToIntersection<Key>] ? ? Key : never;
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/329129.html
標籤:
