假設我想將帶有可選專案的元組[1, 2, 3?, 4?]轉換為僅包含所需專案的陣列 - >[1, 2]
我想出的東西如下圖所示,永遠不會轉向所有可選專案,我被困在這里。
type OnlyReq <L extends any []> = {
[K in keyof L]-?: L [K] extends Required <L> [K] ? L [K] : never
}
type Found = OnlyReq <[1, 2, 3?, 4?]> // [1, 2, never, never]
操場
uj5u.com熱心網友回復:
我在這里的方法是撰寫一個遞回條件型別(實際上是尾遞回,因此它適用于 TS4.5 中相當長的元組),它遍歷元組,直到發現其余部分都是可選的。
請注意,元組型別中的可選元素后面不能跟必需元素;也就是說,類似的事情[1, 2?, 3]是不可能的。所以如果一個元組有任何必需的元素,特別是第一個元素必須是必需的。
這是一個實作:
type OnlyReq<T extends any[], U extends any[] = []> = Partial<T> extends T ? U :
T extends [infer F, ...infer R] ? OnlyReq<R, [...U, F]> : U
我們在型別引數中累積結果U(從空元組開始[]),所以一旦我們決定停止迭代,我們就回傳U。
支票Partial<T> extends T使用的Partial<T>實用型拿出輸入元組的所有可選的版本。一般而言,T extends Partial<T>為真但Partial<T> extends T不是,除非T已經與Partial<T>...相同,換句話說,Partial<T> extends T當且僅當T是全可選的。
如果元組T是全可選的,那么我們回傳U。此外,如果T為空,我們將回傳U(如果T不能拆分為第一個元素F和剩余元組,則會發生這種情況R)。如果T有第一個元素F,那么我們知道它是必需的(否則T將是全可選的),我們可以將它推到U元組的末尾,以便遞回呼叫元組的其余部分R。
讓我們看看它是否有效:
type Found = OnlyReq<[1, 2, 3?, 4?]>
// type Found = [1, 2]
看起來挺好的。
另請注意,元組型別中的其余元素在同一測驗中也被視為“可選”,因此它們也應該被剝離:
type StripRest = OnlyReq<[string, boolean?, ...number[]]>
// type StripRest = [string]
實際上,非元組陣列型別 ( Foo[]) 等價于僅包含一個剩余元素 ( [...Foo[]]) 的元組,因此將轉換為空元組,這可能是也可能不是您想要的:
type Hmm = OnlyReq<number[]>
// type Hmm = []
我正在考慮元組型別中的“前導”或“中間”其余元素超出范圍,因為它們會做一些奇怪的事情而您沒有詢問它們(我希望它不會出現,因為這很煩人操縱此型別別):
type What = OnlyReq<[...string[], number]>
// type What = []
type AlsoWhat = OnlyReq<[string, ...boolean[], number]>
//type AlsoWhat = [string]
Playground 代碼鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/409695.html
標籤:
上一篇:在Typescript中只運行一次裝飾代碼的訪問器裝飾器,在后續呼叫中回傳先前計算的值
下一篇:回傳泛型時的打字稿推理錯誤
