typescript - 关于 TypeScript 中的反向推理
问题描述
这是我的测试代码:
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
,但是编译器不想为您这样做?我猜 newable 签名总是优先考虑(如果你切换工会成员的顺序并不重要)。
幸运的是,@RyanCavanaugh(语言维护者之一)在GitHub 问题评论中提到了降低推理站点优先级的技巧:
T & { }
T
为by design创建一个“低优先级”推理站点。我会将其从“绝对不依赖于此”一栏移至“它可能会在可预见的未来发挥作用”一栏。
所以诀窍是与空对象类型相交。让我们看看它是否有效:
type Prop<T> = { (): T } | { new(...args: any[]): (T & {}) }
我已将其放入T & {}
newable 签名中,以尝试降低其优先级。开始:
propTest(String) // string
让我们确保它仍然适用于User
:
propTest(User) // User
好的,希望有帮助。祝你好运!
推荐阅读
- sql - 是否可以通过签名/哈希码等方式访问记录
- linux - 在 Qemu 上运行的 RISC-V Linux
- mysql - 如何在 vb.net 中从 mysql 加载超过 2 万条数据到数据表,而不会在数据读取过程中遇到致命错误
- python - 从 JSON 创建字典
- excel - 数据连接刷新后保存 PDF
- jetty - 一旦我将 keycloak 适配器应用于我的 jetty_base,Jetty 9.3 和 9.4 就无法启动
- c# - IIS 和 Windows 服务中托管的 WCF 服务的 OpenTelemetry
- python - Python:汇总 CSV 中的值
- python - Python - 根据给定的键数动态创建新字典中的键数:值:来自另一个字典的值
- mysql - mysql有条件地在where子句中应用乘法因子