这是我的测试代码:
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/