在Typescript中,是否可以从现有对象声明“type”?

时间:2017-04-27 11:51:42

标签: typescript

说,我有这样的功能:

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)) { ... }

2 个答案:

答案 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) { }