【问题标题】:In Typescript, can a method exist only on a subclass?在 Typescript 中,方法只能存在于子类中吗?
【发布时间】:2015-05-05 17:31:46
【问题描述】:

我在打字稿应用程序中有一个继承层次结构,类似于以下内容:

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 中的原型继承,无论定义在哪里,都会在层次结构中搜索该方法。

作为一种解决方法,我在基类中添加了一个抽象方法,然后在子类中提供了实现。这样做的问题是我需要能够根据应用程序状态将一个子类交换为另一个子类。而且对我来说,似乎没有必要在父类上定义一个所有子类都不需要实现的方法。

【问题讨论】:

  • 您将其声明为A。 TypeScript 遵循大多数其他类型化语言,如果将其声明为类型,则它是该类型,而不是子类型。
  • 回答您的问题,是的,方法只能存在于子类型中——但是当您引用超类时,您不能引用特定于子类的功能。
  • 啊,我明白了。我认为我正在寻找的是一个界面。编辑:能够在实现该接口的类型之间进行更改。

标签: javascript visual-studio inheritance typescript


【解决方案1】:

这不起作用,因为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
(instanceB as B).doStuff();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 2021-05-21
    • 1970-01-01
    • 2018-04-28
    • 2018-11-24
    • 2015-07-20
    相关资源
    最近更新 更多