TypeScript

时间:2016-05-26 00:57:31

标签: typescript bounded-types

我对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作为输入的约束?

1 个答案:

答案 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的事件规范的函数。

更多

这包括在内:

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