用附加参数扩展另一个TypeScript函数

Tho*_*mas 3 typescript

是否可以在TypeScript中定义函数类型并将其参数列表扩展为其他类型(重载函数类型?)?

假设我有这种类型: type BaseFunc = (a: string) => Promise<string>

我想用一个附加参数(b:数字)和相同的返回值定义另一种类型。

如果将来某个时候BaseType添加或更改参数,这也应该反映在我的重载函数类型中。

这可能吗?

Ger*_*ger 10

您可以使用带有参数<>的扩展:

function base(a: number, b: number, c: number): number
function derived(add: string, ...base: Parameters<typeof base>): number
Run Code Online (Sandbox Code Playgroud)

限制是基本参数必须位于末尾。


Iva*_*hko 6

UPD:可以在 TypeScript 中扩展函数的参数。见提香的回答

原始答案:我怀疑是否可以按照您描述的方式完成。但是,您可以尝试以下操作:

interface BaseOptions {
    a: string;
}
type BaseFunc = (options: BaseOptions) => Promise<string>

interface DerivedOptions implements BaseOptions {
    b: number;
} 
type DerivedFunc = (options: DerivedOptions) => Promise<string>
Run Code Online (Sandbox Code Playgroud)

这种方法的另一个优点是您可以免费命名参数。因此,从调用方来看,它会比仅仅调用BaseFuncDerivedFunc使用位置参数更清晰。比较一下:

someFuncA(1, undefined, true);

// vs

someFuncB({nofiles: 1, enableLogging: true});  // and bar: undefined is just omitted
Run Code Online (Sandbox Code Playgroud)


Tit*_*mir 5

您可以在休息参数中使用元组,并将表达式条件类型条件类型推断行为一起使用以从签名中提取参数并重建新签名。

type BaseFunc = (a: string) => Promise<string>

type BaseWithB  = BaseFunc extends (...a: infer U) => infer R ? (b: number, ...a:U) => R: never;
Run Code Online (Sandbox Code Playgroud)

  • @MoshFeu 在 ts 4.0+ 中,您可以执行 `type BaseWithB = BaseFunc extends (...a: infer U) =&gt; infer R ?(...a:[...U, number]) =&gt; R: 从不;` (3认同)
  • @Thomas 当然没问题,我同意这是一个更好的设计。我只是回答你问的具体打字稿问题:) (2认同)