Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript-向函数的参数添加一个参数_Typescript - Fatal编程技术网

Typescript-向函数的参数添加一个参数

Typescript-向函数的参数添加一个参数,typescript,Typescript,我想创建一个与上面一样的类型,只是在末尾添加了一个参数。比方说,d:数字 不过,我不想手动创建整个类型,我很确定这里有一个使用参数的智能技巧。您可以为基函数args使用其他类型: type SomeFuncAltered = (a:string, b:number, c:someCustomType, d:number) => number; 这是可能的,但相当复杂。更多信息可以在@jcalz-的回答中找到 在您的情况下,我们可以重用上面答案中的一些实用程序,确切地说是Cons和Push

我想创建一个与上面一样的类型,只是在末尾添加了一个参数。比方说,d:数字


不过,我不想手动创建整个类型,我很确定这里有一个使用参数的智能技巧。

您可以为基函数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>