我有通用mergeArrays的,它不依賴于引數的順序。但是當在另一個泛型中使用時,它似乎取決于結果。但這是無法理解的。
type Fn = (...args: any[]) => any;
type arr1LessThanOrEqual<
T1 extends ReadonlyArray<any>,
T2 extends ReadonlyArray<any>
> = T1["length"] extends T2["length"]
? true
: T2["length"] extends 0
? false
: T2 extends [infer First, ...infer Rest]
? Rest extends ReadonlyArray<any>
? arr1LessThanOrEqual<T1, Rest>
: never
: never;
type mergeArrWithLeft<
T1 extends ReadonlyArray<any>,
T2 extends ReadonlyArray<any>
> = readonly [
...{
readonly [Index in keyof T1]: Index extends keyof T2
? (T1[Index] & T2[Index])
: T1[Index];
}
];
type mergeArrays<
T1 extends ReadonlyArray<any>,
T2 extends ReadonlyArray<any>
> = arr1LessThanOrEqual<T1, T2> extends true
? mergeArrWithLeft<T2, T1>
: mergeArrWithLeft<T1, T2>;
在這里我使用這個通用的:
type LargestArgumentsList<T extends ReadonlyArray<any>> = T extends readonly [
(...args: infer Args) => any,
...infer Rest
] ?
mergeArrays<LargestArgumentsList<Rest>, Args> // here if I swap it does not work, but generic mergeArrays does not depend on order of params, so it is a mistery
: readonly [];
它有效。但如果我把它換成:
type LargestArgumentsList<T extends ReadonlyArray<any>> = T extends readonly [
(...args: infer Args) => any,
...infer Rest
] ?
mergeArrays<Args, LargestArgumentsList<Rest>>
: readonly [];
的行為LargestArgumentsList不同,這里是操場
我試圖創建一個泛型,它在函式陣列中找到最長的引數串列。而且我希望mergeArrays通用不依賴于引數的順序。我測驗過,它不依賴于引數的順序。但在另一個 generic( LargestArgumentsList) 中,它的作業方式不同。
uj5u.com熱心網友回復:
的定義在約束arr1LessThanOrEqual中缺少 a 。由于不是只讀的,當是第二個引數時有效,但如果你將它與只讀交換,它將失敗。readonlyT2 extends [infer First, ...infer Rest]Argsarr1LessThanOrEqualArgsLargestArgumentsList<Rest>
如果將約束替換為
T2 extends readonly [infer First, ...infer Rest]
LargestArgumentsList即使交換引數也可以作業。
TypeScript 游樂場
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/445932.html
標籤:javascript 打字稿 打字稿泛型
