2015-03-19 8 views
0

Следующий код вызовет ошибку: Невозможно вызвать выражение, тип которого не имеет сигнатуры вызова.Значения типа соединения, переданные методу, не могут быть вызваны

Если интерфейсы были одинаковыми (оба содержат «a», например), все работает нормально. Почему?

interface Foo { a:string } 
interface Bar { b:string } 

var stuff: Foo[] | Bar[]; 

function doStuff(thing: Foo | Bar) { 
    var index = stuff.indexOf(thing); 
} 
+0

Должен ли материал быть [массив (Foos или Bars)] вместо [(массив Foos) или (массив баров)]? (Я не знаком с машинописными текстами, поэтому, возможно, я неправильно читаю подпись типа) – axblount

+0

Действительно, вы правы. Не стесняйтесь публиковать его в качестве ответа, и я буду отмечать его как таковой. – myartsev

ответ

5

Сейчас stuff является объединением Foo массивов и массивов Bar. Вы пытаетесь проверить элемент типа (Foo или Bar) на него. Если stuff имеет фактический тип Foo [] и thing имеет фактический тип Bar, у вас есть несоответствие типа.

Тип материала должен быть массивом (Foo или Bar).

var stuff: (Foo | Bar)[];