【发布时间】:2020-10-10 16:33:23
【问题描述】:
问题
拥有一个具有构造函数签名的泛型类型T(例如,此类型:{ new(): any }),返回一个与T 相同的类型U,只是它缺少构造函数签名。将构造函数签名添加回U 应该会导致两种类型相同。
我为什么需要这个
假设我正在编写一个函数,该函数接受一个类并将其 构造函数签名 更改为不同的东西。这通常是代理的情况,例如,此代理从构造函数调用中删除最后一个参数并记录它:
function trapClass(cl) {
return new Proxy(cl, {
construct: (target, args) => {
console.log( args.pop() )
return new target(...args)
}
})
}
class Foo { constructor(...args){ console.log(args) } }
const Bar = trapClass(Foo)
new Foo(1, 2, 3) // [1, 2, 3]
new Bar(1, 2, 3) // 3, [1, 2]
如何输入?函数trapClass<T>(cl: T) 应该是一个通用函数,它接受带有构造函数签名的T,并返回带有不同构造函数签名的T。当我尝试将T 与新签名相交时,例如:T & { new(a, b, c): any },那么新签名不会替换旧签名,而是与旧签名合并为重载调用。
如果我知道如何从T 中删除构造函数签名,那么问题将是微不足道的。
调用签名
虽然我不需要从T 中省略调用签名,但删除构造函数签名和调用签名的问题非常相似。我希望这两个问题的解决方案只会在new 关键字和Parameters 而不是ConstructorParameters 方面有所不同。所以我认为答案可能会提到这两个问题。但是,如果解决方案不太相似,请不要打扰调用签名,我会提出一个单独的问题:)
【问题讨论】:
-
所需的解决方案应该适用于 any 类还是只适用于
Foo?
标签: typescript typescript-typings