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>>;