代码之家  ›  专栏  ›  技术社区  ›  Eduardo Rosostolato

Typescript:类扩展泛型类型

  •  2
  • Eduardo Rosostolato  · 技术社区  · 6 年前

    我知道它太泛型了,但我希望创建一个类,该类将具有所有来自如下泛型类型的道具和原型:

    class GenericExtend<T> extends T {
        constructor(data: T) {
            // here is a workaround to make these 2 classes unique
            const proto = { ...GenericExtend.prototype };
            Object.assign(proto, Object.getPrototypeOf(data));
            Object.setPrototypeOf(this, proto);
            Object.assign(this, data);
        }
    
        GenericMethod() { }
    }
    

    现在,我可以 GenericExtend 类,然后获取两个类的类型,如下所示:

    const obj = new GenericExtend<Model>(data);
    obj.GenericMethod(); // ok
    obj.ModelMethod(); // good!
    

    我的解决方案之一是使用交集,类似这样:

    const obj: GenericExtend & Model = new GenericExtend(data) as any;
    

    它起作用了,但我不太喜欢。有什么我能做得更好的吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   jcalz    6 年前

    我想你一定要通过交叉路口才能得到这种行为。。。但是,如果需要的话,可以将类型断言限制在构造函数中,这样以后的使用就不需要它了。让我们重新命名 GenericExtend 让开:

    class _GenericExtend<T> {
      constructor(data: T) {
        const proto = { ..._GenericExtend.prototype };
        Object.assign(proto, Object.getPrototypeOf(data));
        Object.setPrototypeOf(this, proto);
        Object.assign(this, data);
      }
      GenericMethod() { }
    }
    

    然后重新定义 将军Xtend 作为具有所需交集行为的类型和构造函数:

    type GenericExtend<T> = _GenericExtend<T> & T;
    const GenericExtend: new <T>(data: T) => GenericExtend<T> = _GenericExtend as any;
    

    最后一个 as any 是我们需要的类型断言。现在你应该可以得到你想要的行为:

    interface Model {
      ModelMethod(): void;
    }
    declare const data: Model;
    
    const obj = new GenericExtend(data);
    obj.GenericMethod(); // ok
    obj.ModelMethod(); // ok
    

    希望能有所帮助。祝你好运!