这是我的测试代码:
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满足调用和构造函数签名.
所以我的问题是我应该怎么做才能让编译器推断出本机类型?
所以我认为你希望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)
好的,希望有所帮助.祝好运!
| 归档时间: |
|
| 查看次数: |
192 次 |
| 最近记录: |