2015-05-05 25 views
0

我有一個打字稿應用程序的繼承層次結構如下所示:在Typescript中,方法只能存在於子類中嗎?

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

啊,我明白了。我認爲我正在尋找的是一個界面。編輯:能夠在實現該接口的類型之間進行更改。 –

回答

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 
} 

或者通過鑄造instanceBB類型:

// no more error, but will throw an error when instanceB is not B 
(<B> instanceB).doStuff(); 
相關問題