这适用于我是否与某种伪造类型相交,或者是否有合理的约束。所以以下都不适用。
返回一个普通的 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();
}
}
6条答案
按热度按时间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 utilizeT
in some fashion.uz75evzq2#
这个场景在现实世界中是否存在?只是试图理解你想要实现的目标。我们显然需要确保
T
被限制为类似对象的类型,但除此之外,如果我们认为它值得增加的复杂性,我们可能可以做到这一点。tjjdgumg3#
@ahejlsberg,这里有一个实际的提交,我试图将mixins和泛型结合起来:
http://codereview.cc/D3000
抛出错误
any is not a constructor function type,
,尽管这些变量或类型都不是any
。如果我尝试指定参数
Test
(例如withMixin<...>(Test<T>)
),它会用错误的参数调用withMixin
-withMixin(Test(), {})
,这反过来又导致了一个Test cannot be called without new
运行时错误。rkkpypqq4#
(我已经更新了这个差异,以包含来自#14017的解决方法。要查看我之前的内容,请点击这里。)
cgvd09ve5#
关于这个问题的任何解决方案?
我正在尝试做类似的事情,我想在一个类混入中使用另一个类混入。
这里是一个简单的示例:
7cwmlq896#
关于这个问题有什么要说的吗?有没有可能的解决方法?我急切地想听到这个消息,因为我们需要它。
另一个选择可能是这并不是正确的编码方式,那么我也很想听到关于这个问题的看法。