这是我的测试代码:

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 issue comment中提到:
T & { }通过设计为T创建“低优先级”推理站点。我会把这个从“绝对不依赖这个”栏移到“它可能在可预见的未来工作”栏。
所以诀窍是将某个对象与空对象类型相交。让我们看看它是否有效:

type Prop<T> = { (): T } | { new(...args: any[]): (T & {}) }

我已将T & {}放入新签名中,以尝试降低其优先级。这里是:
propTest(String) // string 🎉

让我们确保它仍然适用于User
propTest(User) // User

好吧,希望能帮上忙。祝你好运!

关于typescript - 关于TypeScript中的反向推理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51296287/

10-09 22:05