TypeScript 无法扩展构造泛型类型的mixin构造函数,

slhcrj9b  于 6个月前  发布在  TypeScript
关注(0)|答案(6)|浏览(83)

这适用于我是否与某种伪造类型相交,或者是否有合理的约束。所以以下都不适用。

返回一个普通的 T

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

export interface Timestamp {
    timestamp: Date;
}

// plain old T
export function Timestamp<T, CT extends Constructor<T>>(Base: CT): Constructor<Timestamp> & Constructor<T> {
    return class extends Base {
        timestamp = new Date();
    }
}

使用伪造对象类型({})的 T 构造函数

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

export interface Timestamp {
    timestamp: Date;
}

// Constructor of T with a bogus object type
export function Timestamp<T, CT extends Constructor<T & {}>>(Base: CT): Constructor<Timestamp> & Constructor<T> {
    return class extends Base {
        timestamp = new Date();
    }
}

T 中,T 被约束为 {}

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

export interface Timestamp {
    timestamp: Date;
}

export function Timestamp<T extends {}, CT extends Constructor<T>>(Base: CT): Constructor<Timestamp> & Constructor<T> {
    return class extends Base {
        timestamp = new Date();
    }
}

T 中,T 被约束为 object (也参见 #13805)

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

export interface Timestamp {
    timestamp: Date;
}

export function Timestamp<T extends object, CT extends Constructor<T>>(Base: CT): Constructor<Timestamp> & Constructor<T> {
    return class extends Base {
        timestamp = new Date();
    }
}
ecr0jaav

ecr0jaav1#

@mhegazy mentioned offline that T is useless in these cases anyway. I think that's beside the point, because you can imagine that when actually using the mixin pattern, you will utilize T in some fashion.

uz75evzq

uz75evzq2#

这个场景在现实世界中是否存在?只是试图理解你想要实现的目标。我们显然需要确保 T 被限制为类似对象的类型,但除此之外,如果我们认为它值得增加的复杂性,我们可能可以做到这一点。

tjjdgumg

tjjdgumg3#

@ahejlsberg,这里有一个实际的提交,我试图将mixins和泛型结合起来:
http://codereview.cc/D3000

class Test<T> implements Interface<T> {}

class Demo<T> extends withMixin<T, Constructor<Interface<T>>>(Test) {}

抛出错误 any is not a constructor function type,,尽管这些变量或类型都不是 any
如果我尝试指定参数 Test(例如 withMixin<...>(Test<T>)),它会用错误的参数调用 withMixin - withMixin(Test(), {}),这反过来又导致了一个 Test cannot be called without new 运行时错误。

rkkpypqq

rkkpypqq4#

(我已经更新了这个差异,以包含来自#14017的解决方法。要查看我之前的内容,请点击这里。)

cgvd09ve

cgvd09ve5#

关于这个问题的任何解决方案?
我正在尝试做类似的事情,我想在一个类混入中使用另一个类混入。
这里是一个简单的示例:

class MyClass {
  myClass = 1;
}
type Constructor<T extends MyClass> = new (...args: any[]) => T;

function make1<T extends Constructor<MyClass>>(base: T) {
  return class extends base {
    make1 = 1;
  };
}
/**
* [ts] Type '{
*   new (...args: any[]): make3<T>.(Anonymous class);
*   prototype: make3<any>.(Anonymous class); } & T'
* is not a constructor function type. [2507]
*/
function make2<T extends Constructor<MyClass>>(base: T) {
  return class extends make1(base) {
    make2 = 2;
  };
}

class Test extends MyClass {}

class Test2 extends make2(Test) {
  constructor() {
    super();
    // this.myClass is gone
    // this.make1 is gone
    // only this.test2 exists
  }
}
7cwmlq89

7cwmlq896#

关于这个问题有什么要说的吗?有没有可能的解决方法?我急切地想听到这个消息,因为我们需要它。
另一个选择可能是这并不是正确的编码方式,那么我也很想听到关于这个问题的看法。

相关问题