关于TypeScript中的反向推理

jkc*_*hao 3 typescript

这是我的测试代码:

type Prop<T> = { new(...args: any[]): T } | { (): T }
declare function propTest<T>(t: Prop<T>): T
Run Code Online (Sandbox Code Playgroud)

当我定义一个类时,它会没问题:

class User {}
propTest(User) // User
Run Code Online (Sandbox Code Playgroud)

但是当我用本机构造函数传递它时:

propTest(String) // String(not string)
Run Code Online (Sandbox Code Playgroud)

原因是String满足调用和构造函数签名.

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

jca*_*alz 5

所以我认为你希望T在从可更新的签名(()=>T)中推断之前从可调用签名()中推断出来new(...args: any[])=>T,但是编译器不想为你做那个?我想新的签名总是优先考虑(如果你改变联合成分的顺序也没关系).

幸运的是,有一个降低推理网站优先级的技巧,@ RyanCavanaugh(语言维护者之一)在GitHub问题评论中提到:

T & { }为创建一个"低优先级"的推断网站T 设计.我会将其从"绝对不依赖于此"专栏移至"它可能会在可预见的未来发挥作用"一栏.

所以诀窍是将某些东西与空对象类型相交.让我们看看它是否有效:

type Prop<T> = { (): T } | { new(...args: any[]): (T & {}) }
Run Code Online (Sandbox Code Playgroud)

我已经把新的T & {}签名,以试图降低其优先级.开始:

propTest(String) // string 
Run Code Online (Sandbox Code Playgroud)

让我们确保它仍适用于User:

propTest(User) // User
Run Code Online (Sandbox Code Playgroud)

好的,希望有所帮助.祝好运!