2016-05-26 2 views
1

Я довольно новичок в 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 в качестве входных данных?

ответ

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

+0

Спасибо. Разочаровое дизайнерское решение IMHO, но это, безусловно, не ваша вина. –

Смежные вопросы