在 typescript 中,我們已經能夠使用遞回部分:Recursive Partial<T> in TypeScript
是否可以創建相同的泛型但能夠為其設定depth級別?
例如:
interface RecursivePartialWithDepth<T, Depth extends number = 0> {
...implementation
}
這樣我們就可以將它用于任意深度:
type p1 = {
a: number;
};
type p2 = {
b: p1;
c: number;
};
type p3 = {
d: p2;
e: number;
};
type PartialWithLevelTwo = RecursivePartialWithDepth<p3, 2>;
/* and it will result to:
{ d?: { b?: { a: number }, c?: number }, e?: number }
Note that `a` is required!
*/
如果有可能,那么如何創建這樣的 Generic?
uj5u.com熱心網友回復:
解決方案:
type Increment<A extends number[]> = [...A, 0];
type DeepPartial<
T,
Depth extends number = 0,
CurrentDepth extends number[] = []
> = T extends PrimitiveType
? T
: CurrentDepth["length"] extends Depth
? T
: {
[K in keyof T]?: DeepPartial<T[K], Depth, Increment<CurrentDepth>>;
};
type PartialWithLevelTwo = DeepPartial<p3, 2>;
const partialItem: PartialWithLevelTwo = {};
type PrimitiveType =
| string
| number
| boolean
| undefined
| null
| symbol
| bigint;
解釋:
我們首先定義一個Increment增加所提供元組長度的實用程式型別。
然后我們定義DeepPartial;它需要T,要操作的型別,Depth,所需的深度(默認為 0),以及CurrentDepth,我們所處的當前深度。
如果T擴展了一個原語,我們只回傳T。
但是,如果不是,它必須是某種物件。
如果我們所處的當前深度超過了深度限制,我們停止并回傳T。
如果我們還能繼續,我們就做什么Partial。
唯一不同的是,不是T[K]我們DeepPartial再次使用,而是提供相同的深度,并增加當前深度。
一個公平的說明:因為這期望number[]作為深度(在這里使用陣列的長度作為我們的數字),[0, 0]如果你想要2等的深度,你必須提供。
但是,您可以撰寫一個型別,該型別可以創建一個長度為 N 并用 0 填充的陣列。
操場
這是一個使用數字而不是陣列但受增量范圍限制的版本
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/428553.html
標籤:打字稿
