У меня есть общий 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
) это работает по-другому.
В определении arr1LessThanOrEqual
отсутствует readonly
в ограничении T2 extends [infer First, ...infer Rest]
. Поскольку Args
не только для чтения, arr1LessThanOrEqual
работает, когда Args
является вторым параметром, но если вы замените его на LargestArgumentsList<Rest>
только для чтения, произойдет сбой.
Если вы замените ограничение на
T2 extends readonly [infer First, ...infer Rest]
LargestArgumentsList
будет работать, даже если параметры поменялись местами.