Я довольно новичок в TypeScript, поэтому, возможно, я просто делаю что-то глупое, но я нашел то, что кажется либо ошибкой, либо ограничением. Я определил интерфейс для функции, которая принимает Foo
. Если я передам эту функцию другой функции, контракт, похоже, будет заключаться в том, что функция I pass должна принимать любойFoo
. Однако, если я определяю class Bar extends Foo
, а затем функцию, которая принимает Bar
, но не Foo
, я могу передать ее функции, требующей функции, принимающей любые Foo
. Пример:Нижние ограниченные параметры в TypeScript
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;
}
но машинописный индекс, похоже, не имеет этого. Как я могу принудить ограничение, чтобы функция, переданная в needsAFunctionThatTakesAnyFoo
, принимала любые Foo
в качестве входных данных?
Спасибо. Разочаровое дизайнерское решение IMHO, но это, безусловно, не ваша вина. –