这是我的测试代码:
type Prop<T> = { new(...args: any[]): T } | { (): T }
declare function propTest<T>(t: Prop<T>): T
当我定义一个类时,就可以了:
class User {}
propTest(User) // User
但是当我用本机构造函数传递它时:
propTest(String) // String(not string)
原因是String
满足调用和构造函数签名。
所以我的问题是我应该怎么做才能让编译器推断本机类型?
所以我认为你会喜欢T
从可调用签名推断(()=>T
)在从可更新签名(new(...args: any[])=>T
),但编译器不想为你做这件事?我猜想可更新的签名总是优先的(如果你改变工会成员的顺序也没关系)。
幸运的是,@RyanCavanaugh(语言维护者之一)在一篇文章中提到了一个降低推理站点优先级的技巧。GitHub 问题评论 https://github.com/Microsoft/TypeScript/issues/14829#issuecomment-320754731:
T & { }
创建一个“较低优先级”的推理站点T
按设计。我会将其从“绝对不依赖于此”专栏移至“它可能会在可预见的未来发挥作用”专栏。
所以技巧就是将某些东西与空对象类型相交。让我们看看它是否有效:
type Prop<T> = { (): T } | { new(...args: any[]): (T & {}) }
我已经把T & {}
在可更新的签名中,尝试降低其优先级。这里是:????
propTest(String) // string ????
让我们确保它仍然有效User
:
propTest(User) // User
好的,希望有帮助。祝你好运!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)