TypeScript:函数接口作为类中的可调用对象

时间:2014-04-10 15:16:57

标签: typescript

我想创建一个函数接口,它可以作为类中的可调用函数。

基本上我想要做的是以下内容:

interface Callable {
    (x: number): number;
    someAdditionalStuff?: any;
}

class Foo {
    doSomething: Callable (x: number) {
        return x + 3;
    }
}

我知道Foo.doSomething没有正确的语法。

我想知道这是否有可能实现?

更新:为了让它更清晰一点。我想要的是,doSomehting的类型是Callable。但是我想在课堂上充实函数体,而不是在界面中充实,我不希望你必须在类或函数实现中的任何地方设置someAdditionalStuff

目标是,每次我创建一个新的类实例时,我都可以向类成员添加不同的东西。

1 个答案:

答案 0 :(得分:1)

你可以这样写:

interface Callable {
    (x: number): number;
    someAdditionalStuff?: any;
}

class Foo {
    doSomething: Callable = (x: number) => {
        return x + 3;
    }
}

一个重要的问题是你想要Foo.doSomething.someAdditionalStuff的语义。使用上面的代码,Foo的每个实例都有自己的doSomething闭包副本,因此一个类中的更改不会反映在另一个类中:

var x = new Foo();
var y = new Foo();
x.doSomething.someAdditionalStuff = 3;
// Changing this value does not change the value on 'x' - desired?
y.doSomething.someAdditionalStuff = 'foo';

我猜这就是你想要的。

如果您希望someAdditionalStuff基本上是静态的,那么您可以采用更复杂的解决方法。我会尝试提出一些更简单的东西......

class _Bar {
    someOtherThing() {}
    doSomething(x: number) {
        return x + 3;
    }
}

interface Bar extends _Bar {
    doSomething: Callable;
}

var Bar: { new(): Bar } = _Bar;

// User code:
var f = new Bar();
var g = new Bar();
f.doSomething.someAdditionalStuff = 'ok';
alert(g.doSomething.someAdditionalStuff); // "ok"