如何扩展新继承的TypeScript知识?

如何扩展新继承的TypeScript知识?,typescript,Typescript,如何使TypeScript知道在Factory类的Base变量中发生的所有继承,这样就不会出现错误。这肯定是可能的,因为我在最后得到了结果,但是类型“Rect”上不存在属性“X”会抛出错误 接口可打印{ print():无效; } 接口可读取{ log():void; } 类工厂IShape>{ 构造函数(公共基:T){} 可打印(){ this.Base=类扩展了这个。Base实现了IPrintable{ 打印(){ log(`${this.x}:${this.y}`); } } 归还这个;

如何使TypeScript知道在
Factory
类的
Base
变量中发生的所有继承,这样就不会出现错误。这肯定是可能的,因为我在最后得到了结果,但是类型“Rect”上不存在属性“X”会抛出错误

接口可打印{
print():无效;
}
接口可读取{
log():void;
}
类工厂IShape>{
构造函数(公共基:T){}
可打印(){
this.Base=类扩展了这个。Base实现了IPrintable{
打印(){
log(`${this.x}:${this.y}`);
}
}
归还这个;
}
Loggable(){
this.Base=类扩展了this.Base实现了ILogable{
日志(){
log(`${this.x}:${this.y}`);
}
}
归还这个;
}
}
界面IShape{
x:号码,,
y:号码
}
类Rect实现了IShape{
建造师(
公共x:号码,
公众y:号码
) {}
}
const RectMaxed=新工厂(Rect).Printable().Loggable().Base;
const rectMaxed=新rectMaxed(10,20);
rectMaxed.print();
rectMaxed.log();

每次添加方法时,都需要创建工厂的新实例。请尝试以下代码:

interface IPrintable {
    print(): void;
}

interface ILoggable {
    log(): void;
}

type Constructor<T> = new (...args: any[]) => T;

class Factory<T extends new (...args: any) => IShape> {
    constructor(public Base: T) {}

    Printable() {
        return new Factory<T & Constructor<IPrintable>>(class extends this.Base implements IPrintable {
            print() {
                console.log(`${this.x}:${this.y}`);
            }
        });
    }

    Loggable() {
        return new Factory<T & Constructor<ILoggable>>(class extends this.Base implements ILoggable {
            log() {
                console.log(`${this.x}:${this.y}`);
            }
        });
    }
}

interface IShape {
    x: number,
    y: number
}

class Rect implements IShape {
    constructor(
        public x: number,
        public y: number
    ) {}
}

const RectMaxed = new Factory(Rect).Printable().Loggable().Base;
const rectMaxed = new RectMaxed(10, 20);
rectMaxed.print();
rectMaxed.log();
接口可打印{
print():无效;
}
接口可读取{
log():void;
}
类型构造函数=new(…参数:any[])=>T;
类工厂IShape>{
构造函数(公共基:T){}
可打印(){
return new Factory(类扩展了它。Base实现了IPrintable{
打印(){
log(`${this.x}:${this.y}`);
}
});
}
Loggable(){
return new Factory(类扩展了它。基实现了ILOGABLE{
日志(){
log(`${this.x}:${this.y}`);
}
});
}
}
界面IShape{
x:号码,,
y:号码
}
类Rect实现了IShape{
建造师(
公共x:号码,
公众y:号码
) {}
}
const RectMaxed=新工厂(Rect).Printable().Loggable().Base;
const rectMaxed=新rectMaxed(10,20);
rectMaxed.print();
rectMaxed.log();
我添加了一个新类型
构造函数
,它指示一个类。你也可以试试