关于 TypeScript 中的反向推理

2024-04-09

这是我的测试代码:

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(使用前将#替换为@)

关于 TypeScript 中的反向推理 的相关文章

随机推荐