首页 > 解决方案 > 关于 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同时满足调用和构造函数签名。

所以我的问题是我应该怎么做才能让编译器推断本机类型?

标签: typescript

解决方案


所以我认为您希望在从可调用签名()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

好的,希望有帮助。祝你好运!


推荐阅读