TypeScript 中的下限参数

Lower bounded parameters in TypeScript

我对 TypeScript 还很陌生,所以我很可能只是在做一些愚蠢的事情,但我发现似乎是错误或限制。我已经为接受 Foo 的函数定义了一个接口。如果我将该函数赋予另一个函数,契约似乎是我传递的函数必须采用 any 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 作为其输入的约束?

简化您的代码我们有:

class Foo {
}

class Bar extends Foo {
}

function needsAFunctionThatTakesAnyFoo(f: (x: Foo) => void) {
    let foo = new Foo();
    f(foo);
}

needsAFunctionThatTakesAnyFoo((x: Bar) => { });

支持此功能以允许在事件处理程序中使用通用模式。例如将采用 MouseEvent 的函数赋予仅支持 Event.

的事件规范

更多

此处介绍:

https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Type%20Compatibility.md#comparing-two-functions