Typescript 是否可以键入两个函数数组参数,使第二个参数的长度比第一个参数长一倍?

Typescript 是否可以键入两个函数数组参数,使第二个参数的长度比第一个参数长一倍?,typescript,Typescript,函数数组参数,使第二个参数的长度比第一个参数长一倍 const func = (arr1: number[], arr2: number[]) => {} 前言:我在TS方面还不是很先进,但尽管这个问题没有更好的答案,但看看我最终会得到什么(我会放弃,因为真正的大师之一参与进来,并提供一个更合适的解决方案) plusone型= T扩展1?2 : T延伸2?三: T延伸3?4:从不; 键入plusoneLength={length:plusone}; 函数f(左:{length:T},右:

函数数组参数,使第二个参数的长度比第一个参数长一倍

const func = (arr1: number[], arr2: number[]) => {}

前言:我在TS方面还不是很先进,但尽管这个问题没有更好的答案,但看看我最终会得到什么(我会放弃,因为真正的大师之一参与进来,并提供一个更合适的解决方案)

plusone型=
T扩展1?2 :
T延伸2?三:
T延伸3?4:从不;
键入plusoneLength={length:plusone};
函数f(左:{length:T},右:plusoneLength):void{}
f([1,2]作为常数,[1,2,3]作为常数);
ts操场:

是的。。。有点

declare function takesTupleAndTupleOneLonger<
    A extends unknown[] | readonly unknown[] & { length: Tail<B>['length']; },
    B extends (unknown[] | readonly unknown[])
>(a: A, b: B): void;

takesTupleAndTupleOneLonger(['baz'] as const, ['foo', 'bar'] as const); // OK
takesTupleAndTupleOneLonger([] as const, ['foo', 'bar'] as const, ); // Error
takesTupleAndTupleOneLonger(['baz', 42] as const, ['foo', 'bar'] as const); // Error
此外,如果您根本没有硬编码数组,并且只想检查像
a.length===b.length-1这样的内容,则没有“保存”的方法这将导致类型域,因此它将可用于
takesTupleAndTupleOneLonger
-您仍然被允许,因为您将处理长度未知的数组(对于编译器而言),但它不会以您想要的方式安全

不过,如果处理编译时已知的数组,这可能会很有用

最后,我的实现依赖于
Tail
,我在ambient
.d.ts
文件中定义了它,如下所示:

/** Used internally for `Tail`. */
type AsFunctionWithArgsOf<T extends unknown[] | readonly unknown[]> = (...args: T) => any;

/** Used internally for `Tail` */
type TailArgs<T> = T extends (x: any, ...args: infer T) => any ? T : never;

/** Elements of an array after the first. */
type Tail<T extends unknown[] | readonly unknown[]> = TailArgs<AsFunctionWithArgsOf<T>>;
/**内部用于“Tail”*/
键入AsFunctionWithArgsOf=(…args:T)=>any;
/**内部用于“Tail”*/
类型TailArgs=T扩展(x:any,…args:infert)=>any?T:从来没有;
/**数组中第一个元素之后的元素*/
类型Tail=TailArgs;
takesTupleAndTupleOneLonger(['baz'], ['foo', 'bar']); // OK
takesTupleAndTupleOneLonger([], ['foo', 'bar']); // OK ← but shouldn’t be!
takesTupleAndTupleOnelonger(['baz', 42], ['foo', 'bar']); // OK ← but shouldn’t be!
/** Used internally for `Tail`. */
type AsFunctionWithArgsOf<T extends unknown[] | readonly unknown[]> = (...args: T) => any;

/** Used internally for `Tail` */
type TailArgs<T> = T extends (x: any, ...args: infer T) => any ? T : never;

/** Elements of an array after the first. */
type Tail<T extends unknown[] | readonly unknown[]> = TailArgs<AsFunctionWithArgsOf<T>>;