2015-05-05 2 views
0

У меня есть иерархия наследования в приложении машинописи, похожее на следующее:В машинописном документе может ли существовать метод только в подклассе?

class A { 
    someProp: any; 

    constructor(someObj: any){ 
    } 
} 


class B extends class A { 
    constructor(someObj: any){ 
     super(someObj); 
    } 

    public doStuff(){ 
     console.log("doing stuff!"); 
    } 
} 

Во втором файле, я пытаюсь вызывать методы подкласса после инстанцирования его следующим образом:

var instanceB: A; 
... 
instanceB = new B(someObj); 
instanceB.doStuff(); // produces error symbol cannot be resolved, it is probably located in an inaccessible module 

Так Что я делаю не так? Насколько я понимаю прототипное наследование в JavaScript, метод будет искать в иерархии независимо от того, где он определен.

Как обходной путь, я добавил абстрактный метод в базовый класс, а затем я предоставляю реализацию в подклассе. Проблема заключается в том, что мне нужно иметь возможность подкачки одного подкласса для другого в зависимости от состояния приложения. И для меня нет необходимости определять метод родительского класса, который не должен реализовывать все подклассы.

+4

Вы объявляете это как 'A'. TypeScript следует за большинством других типизированных языков, если вы объявляете его как тип, это тот тип, а не подтип. –

+1

Чтобы ответить на ваш вопрос, да, методы могут существовать только в подтипах, но когда ваша ссылка на суперкласс, вы не можете ссылаться на определенные подклассы функции. –

+0

А, я вижу. Я думаю, что тогда я ищу интерфейс. edit: чтобы иметь возможность изменять типы, реализующие этот интерфейс. –

ответ

2

Это не работает, потому что вы определяете instanceB как тип A, а не подтип B.

Вы можете выполнять методы, которые принадлежат B, если instanceB действительно экземпляр B, с помощью type guard:

var instanceB: A; 
... 
instanceB = new B(someObj); 
if (instanceB instanceof B) { 
    instanceB.doStuff(); // no more error 
} 

Или литьем instanceB быть типа B:

// no more error, but will throw an error when instanceB is not B 
(<B> instanceB).doStuff(); 
Смежные вопросы