首页 > 解决方案 > 类继承中的打字稿元组,丢失类型

问题描述

我如何用元组覆盖类数组并在索引中添加本机实例并保留类型?

我怎样才能使它有效,正确的语法是什么?

操场:操场

class Base {
    protected children?:Base[]
}
class Containers extends Base {
    protected override children:Array<Containers|Primitives>; 
}

class Primitives extends Base {
}

class A extends Containers {
 // so children should automaticly someting like : [A,A,B,...Containers|Primitives] ?
    protected override children:[A,A,B]
    init(){
        const i0 = this.children[0];
        const i1 = this.children[1]; 
        const i2 = this.children[2]; 
        const i3 = this.children[3]; // should Containers|Primitives|undefined because extends Containers ?
    }

}
class B extends Containers {

}

所以在这段代码中,A 可以在索引中有本地实例children,我使用 getter 。但是......其余的children应该自动继承父母Containers|Primitives吗?

这也很奇怪,如果我删除类型,一切都变成了实例 A ?! 在此处输入图像描述

编辑:我知道我可以这样写! protected override children:[A,...Array<Containers|Primitives>] 但是我从父类重复代码,有没有避免重复的好方法?

标签: javascripttypescripttuplesvariadic-tuple-types

解决方案


class Base {
    protected children?: Base[]
}
class Containers extends Base {
    // let say, container entity can have childrens (Containers|Primitives)
    protected override children: Array<Containers | Primitives> = [];
}

class Primitives extends Base {
}

class A extends Containers {
    // Let say A have some native instance in children [A,A,B,...Containers|Primitives]
    protected override children: [A, A, B, ...Containers[] | Primitives[]] = [new A(), new A(), new B()];
    init() {
        const i0 = this.children[0];
        const i1 = this.children[1];
        const i2 = this.children[2];
        const i3 = this.children[3]; // // Primitives | Containers
    }

}
class B extends Containers {

}

您需要使用传播语法

[A,A,B,...Containers|Primitives]无法编译,因为您...只能与数组一起使用

操场

children在其自己的初始化程序中直接或间接引用,因此需要显式类型注释


推荐阅读