我想创建一个函数接口,它可以作为类内的可调用函数。
所以基本上我想做的是:
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"