我对TypeScript相当新,所以我可能只是在做一些愚蠢的事情,但我发现似乎是一个错误或一个限制。我为一个函数定义了一个接口Foo
。如果我将该函数赋予另一个函数,那么合同似乎是我传递的函数必须采用任何 Foo
。但是,如果我定义class Bar extends Foo
然后定义一个Bar
但不是Foo
的函数,我可以将其传递给需要函数的函数Foo
。例如:
class Foo {
}
class Bar extends Foo {
}
interface TakesAnyFoo {
(x: Foo) : void;
}
function needsAFunctionThatTakesAnyFoo(f: TakesAnyFoo) {
let foo = new Foo();
f(foo);
}
function takesOnlyABar(x: Bar) {
console.log(`I got ${x}`);
}
needsAFunctionThatTakesAnyFoo(takesOnlyABar);
我想我在这里需要的可能就是Java的低边界类型。类似的东西:
interface TakesAnyFoo<T super Foo> {
(x: T) : void;
}
但是Typescript似乎没有这个。如何强制执行传递给needsAFunctionThatTakesAnyFoo
的函数必须接受任何Foo
作为输入的约束?
答案 0 :(得分:1)
简化您的代码:
class Foo {
}
class Bar extends Foo {
}
function needsAFunctionThatTakesAnyFoo(f: (x: Foo) => void) {
let foo = new Foo();
f(foo);
}
needsAFunctionThatTakesAnyFoo((x: Bar) => { });
支持允许事件处理程序中的公共模式。例如为MouseEvent
提供仅支持Event
的事件规范的函数。
这包括在内: