Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
275 views
in Technique[技术] by (71.8m points)

Typescript inheritance from the Tree class (access to properties of parent element)

I want to make a convenient and beautiful (strongly typed) inheritance from the Tree class so that I don't have to cast the "parent" property of Tree to the desired type using the "as" service word

class Tree{
    protected _parent?:Tree;
    private children:Array<Tree> = [];
    addChild(child: Tree){
        child._parent=this;
        this.children.push(child);
    }
    get parent():Tree|undefined {
        return this._parent;
    }
}
class MyClass extends Tree{
    width:number = 10;
    height:number = 10;
}
var mc1:MyClass = new MyClass();
var mc2:MyClass = new MyClass();
mc1.addChild(mc2);
console.log((mc2.parent as MyClass).height); // Works
console.log(mc2.parent?.height); // Error:  Property 'height' does not exist on type 'Tree'

sandbox on typescriptland.org

question from:https://stackoverflow.com/questions/65879538/typescript-inheritance-from-the-tree-class-access-to-properties-of-parent-eleme

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You can use the polymorphic this type in the class for parent and children instead the Tree class:

class Tree {
    protected _parent?: this;
    private children: Array<this> = [];
    addChild(child: this) {
        child._parent = this;
        this.children.push(child);
    }
    get parent(): this | undefined {
        return this._parent;
    }
}
class MyClass extends Tree {
    width: number = 10;
    height: number = 10;
}
var mc1: MyClass = new MyClass();
var mc2: MyClass = new MyClass();
mc1.addChild(mc2);
console.log((mc2.parent as MyClass).height); // Works
console.log(mc2.parent?.height); // ok now

Playground Link


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...