我想创建一个函数接口,它可以作为类内的可调用函数。
所以基本上我想做的是:

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

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

我知道Foo.doSomething没有正确的语法。
我想知道这是否有可能实现?
更新:让它更清楚一些。我想要的是,doSomehting的类型是Callable。但是我想充实类中的函数体,而不是在接口中,并且我不希望你必须在类或函数实现中设置someAdditionalStuff任何地方。
目标是,每当我创建类的新实例时,我可以向类成员添加不同的内容。

最佳答案

你可以这样写:

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

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

一个重要的问题是你想要的是“cc>”的语义。通过上面的代码,Foo.doSomething.someAdditionalStuff的每个实例都得到了自己的Foo闭包副本,因此一个类中的更改不会反映在另一个类中:
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';

我想这就是你想要的。
如果你想要doSomething本质上是“静态的”,那么你可以做一个更复杂的解决方案。我会想些更简单的…
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"

07-24 09:51
查看更多