Typescript 替换函数类型脚本中最后一个参数的类型

Typescript 替换函数类型脚本中最后一个参数的类型,typescript,parameters,tuples,Typescript,Parameters,Tuples,我想替换函数中最后一个参数的类型,同时保留所有函数参数的名称。在我的例子中,最后一个参数也是可选的 例如: 更复杂的是,前面参数的数量和类型是可变的,我只知道最后一个参数是某种类型的,我想用一个自定义参数替换它。好的,这有点困难,我要解释一下。为TL而下;博士 typescript中的参数名称仅在扩展原始参数时保留,如: type OrigParams = Parameters<OrigFunc>; type AnotherFunc = (...args: OrigParams) =

我想替换函数中最后一个参数的类型,同时保留所有函数参数的名称。在我的例子中,最后一个参数也是可选的

例如:


更复杂的是,前面参数的数量和类型是可变的,我只知道最后一个参数是某种类型的,我想用一个自定义参数替换它。

好的,这有点困难,我要解释一下。为TL而下;博士

typescript中的参数名称仅在扩展原始参数时保留,如:

type OrigParams = Parameters<OrigFunc>;
type AnotherFunc = (...args: OrigParams) => any;
这里P1和P2是不同的类型,即使它们在结构上相同

引用TS:

请注意,当元组类型从一系列参数推断出来并随后扩展为参数列表时(如U),原始参数名称将在扩展中使用,但是,这些名称没有语义意义,并且在其他方面不可观察

但是,这可以使用参数元组上的映射类型来完成,因为映射元组会保留参数名称,并在最后一项出现问题时进行一些后处理

为了更改参数,我们可以使用映射类型。映射类型适用于对象上以外的元组,而参数是元组,因此我们提出: 这里的问题是我们不知道最后一个索引,因为您提供的函数具有动态数量的参数。要计算最后一个,我们可以使用一个帮助器来欺骗TS:
这很有趣!希望这能回答您的问题,但是如果您在应用程序中确实需要这一点,我希望您知道自己在做什么,因为这个要求可能可以用更简单的方式解决。

好的,这有点困难,我将对此进行解释。为TL而下;博士

typescript中的参数名称仅在扩展原始参数时保留,如:

type OrigParams = Parameters<OrigFunc>;
type AnotherFunc = (...args: OrigParams) => any;
这里P1和P2是不同的类型,即使它们在结构上相同

引用TS:

请注意,当元组类型从一系列参数推断出来并随后扩展为参数列表时(如U),原始参数名称将在扩展中使用,但是,这些名称没有语义意义,并且在其他方面不可观察

但是,这可以使用参数元组上的映射类型来完成,因为映射元组会保留参数名称,并在最后一项出现问题时进行一些后处理

为了更改参数,我们可以使用映射类型。映射类型适用于对象上以外的元组,而参数是元组,因此我们提出: 这里的问题是我们不知道最后一个索引,因为您提供的函数具有动态数量的参数。要计算最后一个,我们可以使用一个帮助器来欺骗TS:
这很有趣!希望这能回答您的问题,但是如果您在应用程序中真的需要它,我希望您知道自己在做什么,因为这个需求可能可以用一种更简单的方式解决。

令人惊讶的是,您不知道我在尝试实现这一点时遇到了什么困难-大多数困难最终导致函数参数名称归零。对于上下文,我的特定用例是编写对流行库的扩展。这些函数中的每一个:都有一个override属性作为它的最后一个参数,我希望能够用一些自定义参数替换这些override。啊,听起来这是一个非常合理的需要!是的,TS中的这种东西真是个难题!我没有意识到在映射元组/arraysAmazing时keyof会产生索引,你不知道我在尝试得到它时遇到了什么困难-其中大部分最终都将函数args名称归零。对于上下文,我的特定用例是编写对流行库的扩展。这些函数中的每一个:都有一个override属性作为它的最后一个参数,我希望能够用一些自定义参数替换这些override。啊,听起来这是一个非常合理的需要!是的,TS中的这种东西真是个难题!在映射元组/数组时,没有意识到keyof将导致索引
type F = (a: any, b: any) => void;
type P1 = Parameters<F>;
type P2 = [any, any];
type ReplaceLastParam<TParams extends readonly any[], TReplace> = {
    [K in keyof TParams]: // We should put the replace code here
}
type ReplaceParam2<TParams extends readonly any[], TReplace> = {
    [K in keyof TParams]: K extends "2" ? TReplace : TParams[K] 
}
type LastIndex<T extends readonly any[]> =
    ((...t: T) => void) extends ((x: any, ...r: infer R) => void) ?  Exclude<keyof T, keyof R> : never;
// Index helper
type LastIndex<T extends readonly any[]> =
    ((...t: T) => void) extends ((x: any, ...r: infer R) => void) ?  Exclude<keyof T, keyof R> : never;

// Replace last parameter with mapped type
type ReplaceLastParam<TParams extends readonly any[], TReplace> = {
    [K in keyof TParams]: K extends LastIndex<TParams> ? TReplace : TParams[K] 
}

// Replace function
type ReplaceLast<F, TReplace> = F extends (...args: infer T) => infer R
    ? (...args: ReplaceLastParam<T, TReplace>) => R
    : never;