是否可以在TypeScript中定义函数类型并将其参数列表扩展为另一种类型(重载函数类型?)?
比方说我有这种类型:
type BaseFunc = (a: string) => Promise<string>
我想用一个附加参数(b:数字)和相同的返回值定义另一种类型。
如果将来BaseType
添加或更改参数,这也应反映在我的重载函数类型中。
这可能吗?
答案 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>
此方法的另一个优点是您免费拥有命名参数。因此,从调用方来看,它比使用位置参数调用BaseFunc
或DerivedFunc
更为干净。只是比较一下:
someFuncA(1, undefined, true);
// vs
someFuncB({nofiles: 1, enableLogging: true}); // and bar: undefined is just omitted
答案 1 :(得分:2)
您可以将Tuples in rest parameters and spread expressions与conditional type和inference 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) {}
}