Typescript-向函数的参数添加一个参数
我想创建一个与上面一样的类型,只是在末尾添加了一个参数。比方说,d:数字Typescript-向函数的参数添加一个参数,typescript,Typescript,我想创建一个与上面一样的类型,只是在末尾添加了一个参数。比方说,d:数字 不过,我不想手动创建整个类型,我很确定这里有一个使用参数的智能技巧。您可以为基函数args使用其他类型: type SomeFuncAltered = (a:string, b:number, c:someCustomType, d:number) => number; 这是可能的,但相当复杂。更多信息可以在@jcalz-的回答中找到 在您的情况下,我们可以重用上面答案中的一些实用程序,确切地说是Cons和Push
不过,我不想手动创建整个类型,我很确定这里有一个使用参数的智能技巧。您可以为基函数args使用其他类型:
type SomeFuncAltered = (a:string, b:number, c:someCustomType, d:number) => number;
这是可能的,但相当复杂。更多信息可以在@jcalz-的回答中找到 在您的情况下,我们可以重用上面答案中的一些实用程序,确切地说是Cons和Push,通过使用它们,您需要AddArgument来生成最终类型。考虑:
type FuncBaseArgs = {
a: string;
b: number;
c: boolean;
}
type SomeFunc = ({...obj }: FuncBaseArgs) => number;
type SomeFuncAltered = ({...obj }: FuncBaseArgs, d: number) => number;
如果它是在前面添加的,您可以这样做:键入alterany>=extraArg:number,…args:Parameters=>ReturnType;。但我不知道如何在末尾添加它,因为rest args只能在末尾。。。太好了。不是一般的,但很实用。
type FuncBaseArgs = {
a: string;
b: number;
c: boolean;
}
type SomeFunc = ({...obj }: FuncBaseArgs) => number;
type SomeFuncAltered = ({...obj }: FuncBaseArgs, d: number) => number;
type SomeFunc = (a: string, b: number, c: string) => number;
// some utility types for working with tuples
type Cons<H, T extends readonly any[]> =
((head: H, ...tail: T) => void) extends ((...cons: infer R) => void) ? R : never;
type Push<T extends readonly any[], V>
= T extends any ? Cons<void, T> extends infer U ?
{ [K in keyof U]: K extends keyof T ? T[K] : V } : never : never;
// final type you need
type AddArgument<F, Arg> =
F extends ((...args: infer PrevArgs) => infer R)
? (...args: Push<PrevArgs, Arg>) => R : never
// function type with added boolean argument at the end
type NewFunction = AddArgument<SomeFunc, boolean>