我想创建一个函数接口,它可以作为类中的可调用函数。
基本上我想要做的是以下内容:
interface Callable {
(x: number): number;
someAdditionalStuff?: any;
}
class Foo {
doSomething: Callable (x: number) {
return x + 3;
}
}
我知道Foo.doSomething
没有正确的语法。
我想知道这是否有可能实现?
更新:为了让它更清晰一点。我想要的是,doSomehting
的类型是Callable
。但是我想在课堂上充实函数体,而不是在界面中充实,我不希望你必须在类或函数实现中的任何地方设置someAdditionalStuff
。
目标是,每次我创建一个新的类实例时,我都可以向类成员添加不同的东西。
答案 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"