2016-05-25 3 views
0

у меня есть следующий класс в Angular2Angular2 | Машинопись Как вызвать функцию на свойстве с Типы блоков

export class Person { 
    public children: Person[] | (() => Person[]) 
} 

Таким образом, мое намерение состоит в том, чтобы иметь собственность, чтобы дети либо массив из функции, которая может получить меня массив. Не вдаваясь в то, почему этот класс структурирован таким образом, мне хотелось бы узнать, имеет ли кто-то такую ​​же проблему с типом дескриптора, применяющим этот тип при попытке вызвать person.children().

Ошибка:

Cannot invoke an expression whose type lacks a call signature 

Error given by TypeScript

Теперь, если я бросаю человека как «любой», ошибка Машинопись уходит (как и ожидалось) и Javascript выполняет функцию не проблема.

Есть ли способ избежать этого приведения?

+0

Это, конечно, кажется, как код запах. Компилятор просто пытается напомнить вам об этом факте. –

ответ

0

не может ссылаться на выражение, тип которого не хватает вызова подписи

Вы должны использовать type guard (более https://basarat.gitbooks.io/typescript/content/docs/types/typeGuard.html), так что машинопись знает, что его не собирается быть array в этой точке. например

class Person { 
    public children: Person[] | (() => Person[]) 
} 

const person = new Person(); 
if (typeof person.children === 'function'){ 
    person.children(); 
} 

Испытано с alm.tools

enter image description here

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