说,我有这样的功能:
function plus(a: number, b: number) { return a + b }
当然,它的类型是(a: number, b: number) => number
作为Typescript中的函数。
如果我想在没有真正声明其类型的情况下将此函数用作另一个的“参数”,我可以使用默认参数技巧:
function wrap(fn = plus) { ... }
如果我不希望它成为默认参数,除了明确声明其类型之外还有其他选择吗?
简而言之,我不希望这个function wrap(fn: (a: number, b: number) => number) { ... }
,但我确实想要这样的function wrap(fn: like(plus)) { ... }
。
答案 0 :(得分:3)
使用泛型怎么样:
function plus(a: number, b: number) { return a + b }
function wrap<T extends Function>(fn: T) {
fn();
}
// Works
var wrappedPlus = wrap<typeof plus>(plus);
// Error: Argument of type '5' is not assignable to parameter of type '(a: number, b: number) => number'.
var wrappedPlus = wrap<typeof plus>(5);
// Error: Argument of type '5' is not assignable to parameter of type 'Function'.
var wrappedPlus = wrap(5);
function concat(a: string, b: string) { return a + b }
// Error: Argument of type '(a: number, b: number) => number' is not assignable to parameter of type '(a: string, b: string) => string'.
var wrappedPlus = wrap<typeof concat>(plus);
答案 1 :(得分:3)
感谢@OweR ReLoaDeD,type fn = typeof plus
是一个有效的陈述,所以这有效:
function plus(a: number, b: number) { return a + b }
function wrap(fn: typeof plus) { }