Typescript 打字机脚本:";捕获;并在条件中显式处理未解析的泛型?

Typescript 打字机脚本:";捕获;并在条件中显式处理未解析的泛型?,typescript,Typescript,我已经尝试了一段时间来寻找一个现实生活中,但不是太复杂的例子。我希望这能奏效 我们正在使用immer,它导出的Draft类型如下(我将其简化了一点): 我准备了一个引发这种行为的例子 在函数外部,T已解析,一切正常,但在函数内部,我无法调用子函数,因为它期望Draft,并假设T参数不兼容 是的,这是一个有点建设。如果你想要一个真实的例子,你可以看一看,另外,一个未解析泛型上的条件类型采用了所有可能的形式,并因此返回不兼容的函数签名。因此,在不止一种情况下,我希望找到一个好的答案来避免这种TS行为

我已经尝试了一段时间来寻找一个现实生活中,但不是太复杂的例子。我希望这能奏效

我们正在使用
immer
,它导出的
Draft
类型如下(我将其简化了一点):

我准备了一个引发这种行为的例子

在函数外部,
T
已解析,一切正常,但在函数内部,我无法调用子函数,因为它期望
Draft
,并假设
T
参数不兼容


是的,这是一个有点建设。如果你想要一个真实的例子,你可以看一看,另外,一个未解析泛型上的条件类型采用了所有可能的形式,并因此返回不兼容的函数签名。因此,在不止一种情况下,我希望找到一个好的答案来避免这种TS行为:(

我无法使用类型定义为您找到解决方案。我尝试使用来查看是否到达某个位置,但什么都没有。 但是,我可以在您的示例中使用
Draft
类型的方式中找到一个“变通方法”。我只是声明了一个新的
Draft
变量,该变量由
initialParam
初始化,并将类型转换为
Draft
类型

函数genericFn(initialParam:Data){
功能测试(参数:草稿){
// ...
}
常量草稿:草稿=草稿的初始参数;
试验(草案);
回归试验;
}

希望它对您有效。这不是最优雅的解决方案,但它可以阻止Typescript错误。

谢谢您的时间。我知道这个解决方案,但这是一个库类型,因此我必须建议所有用户使用这个解决方案,这就是为什么我试图找到一个可能不需要的解决方案。因此,我将留下这个问题stion暂时开放,也许这里的一个TS奇才知道我们错过了什么:)哦。。。我懂了。的确,这是一个有趣的问题。。。也许有办法,我会一直盯着这条线看是否有人能做到。如果有办法,我真的很愿意知道。我怀疑你能做到这一点;通常,编译器会推迟对这些类型的评估;我不认为有任何行为可以让编译器先发制人地评估这些类型,并使其与已知
t
时得到的类型产生不同的结果。即使你能找到一种方法来做到这一点,我想这将是非常脆弱的,因为这将取决于欺骗编译器。我建议使用不同的方法。示例代码应该使用
typedraft={-readonly[K in keyof T]:Draft}
,因为在映射类型中跳过了原语。您有更好的方法吗?对于我来说,“在映射类型中跳过原语”信息是新的,这可能会有所帮助。草稿的格式有点复杂,但在我们图书馆的背景下,我们可以选择您的简单建议。这将解决我们的第一个问题,我们确实有第二个关于函数签名的问题,尽管我希望通过这种方式解决。我会试着看看我是否也能解决这个问题,或者试着提供一份报告:)谢谢你@jcalz好的,在一些实验之后,这确实适用于TS 3.6和3.7,但所有早期版本都以“类型实例化太深,可能无限”而告终。所以这不是办法:(我能做些什么具体的事情来优化我在TypeScript游戏场上的可复制性吗?事实上,它要复杂得多,并且有一些额外的后果性错误,所以提取这个例子已经相当困难了。(PS:忘了说:这些是库类型,我们必须支持TS到3.3,所以有些事情是不可能的:()通常的建议是不要尝试分配给未解析的条件类型,而是使用断言或。
type Draft<T> = T extends object ?
    {
      -readonly [K in keyof T]:  Draft<T[K]>
    }
  : T
type Draft<T> = 
    T is unresolved ? 
      T 
    : T extends object ?
    {
      -readonly [K in keyof T]:  Draft<T[K]>
    }
  : T