带有泛型的Typescript自定义限制

带有泛型的Typescript自定义限制,typescript,typescript-typings,Typescript,Typescript Typings,在处理库的过程中,我发现在使用泛型时,我觉得什么是bug: type R<A> = A extends Bottom ? A : A type Bottom = { test: number } const f = <A extends Bottom>(a: A) => { useIt(a) // type error here } const useIt = <A extends Bottom>(a: R<A>) => c

在处理库的过程中,我发现在使用泛型时,我觉得什么是bug:

type R<A> = A extends Bottom ? A : A
type Bottom = { test: number }

const f = <A extends Bottom>(a: A) => {
    useIt(a) // type error here
}

const useIt = <A extends Bottom>(a: R<A>) => console.log(a)
使用具体类型而不是泛型将按预期工作,例如:

type X = {test: 1}
const x: R<X> = {test: 1} // all good
const noX: R<X> = {test: 2} // error
type X={test:1}
常数x:R={test:1}//一切正常
常量noX:R={test:2}//错误
对于混凝土类型,具有更好的限制类型也将起到预期的作用:

type R<A> = A extends Bottom ? A : never
const x: R<X> = {test: 1} // all good
const error: R<{}> = {} // type error as expected given that {} doesn't extend Bottom
类型R=A扩展底部?A:从来没有
常数x:R={test:1}//一切正常
const error:R={}//如果{}不扩展Bottom,则按预期键入错误

那么,有没有办法让它与泛型一起工作呢?

这与其说是一个bug,不如说是一个设计限制;未解析的条件类型(依赖于尚未指定的泛型类型参数的类型)或多或少地被编译器完全延迟,并且几乎没有任何内容可分配给它们



有一个公开的问题,建议使用泛型约束来确定未解析条件类型的可分配性;我认为,如果这个建议得到实施,您的示例代码将起作用(因为
extends-Bottom
将被视为正确的)。。。因此,您可能希望解决该问题,并对其进行修改,经过大量修改后,我通过明确添加限制来解决此问题:

const f = <A extends Bottom>(a: R<A>) => {
    useIt(a) // works
}

const useIt = <A extends Bottom>(a: R<A>) => console.log(a)
const f=(a:R)=>{
使用它(a)//有效
}
const useIt=(a:R)=>console.log(a)

请注意,现在
f
参数具有与
useIt
相同的约束,这将使编译器感到高兴。事后看来,这实际上是有道理的,因此我们100%确定该类型也可用于
useIt

非常感谢您提供的所有信息!我的实际用例要复杂得多。我试图为UI库实现一些灵活的约束。看一看:最后,我通过向另一个函数添加限制解决了这个问题,更多细节请参见我的答案
const f = <A extends Bottom>(a: R<A>) => {
    useIt(a) // works
}

const useIt = <A extends Bottom>(a: R<A>) => console.log(a)