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

时间:2018-09-12 11:12:21

标签: typescript

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

比方说我有这种类型: type BaseFunc = (a: string) => Promise<string>

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

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

这可能吗?

3 个答案:

答案 0 :(得分:2)

UPD::可以在TypeScript中扩展一个函数的参数。参见提香的answer

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

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

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

此方法的另一个优点是您免费拥有命名参数。因此,从调用方来看,它比使用位置参数调用BaseFuncDerivedFunc更为干净。只是比较一下:

someFuncA(1, undefined, true);

// vs

someFuncB({nofiles: 1, enableLogging: true});  // and bar: undefined is just omitted

答案 1 :(得分:2)

您可以将Tuples in rest parameters and spread expressionsconditional typeinference behavior of conditional types结合使用,以从签名中提取参数并重建新签名。

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

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

答案 2 :(得分:0)

您可以将任何其他参数设为可选。

class Plant {
  grow(inches: number) {}
}

class Grass extends Plant {
  // adding new optional argument in override
  grow(inches:number, cutOff?: boolean) {}
}

class CrabGrass extends Grass {
  // At this level of overriding, you no longer need it to be optional
  grow(inches:number, cutOff: boolean) {}
}