TypeScript:“ catch”并在条件下显式处理未解决的泛型?

问题描述 投票:2回答:1

我已经尝试了一段时间,以找到一个真实的例子,但并不太复杂。我希望这能奏效。

我们正在使用immer,它会导出看起来像这样的Draft类型(我简化了一下):

type Draft<T> = T extends object ?
    {
      -readonly [K in keyof T]:  Draft<T[K]>
    }
  : T

因此,该类型仅从其遇到的所有对象属性中删除深度嵌套的[​​C0]属性。

效果很好,直到readonly尚未解决。在那种情况下,它保持T并且不能被分配Draft<T>的值(在给定类型的情况下,应该总是可能的)。

所以我的问题是:我能以某种方式检测到类型未解析并以不同的方式返回吗?

本质上是类似

T

我准备了一个引起这种行为type Draft<T> = T is unresolved ? T : T extends object ? { -readonly [K in keyof T]: Draft<T[K]> } : T 的示例。

[在函数外部,as a TypeScript playground已解析,并且一切正常,但是在函数内部,我无法调用子函数,因为它期望T并假定Draft<T>一个参数不兼容。

是的,这有点虚构。如果您想要一个真实的示例,可以看看T,此外,未解析的泛型上的条件类型采用所有可能的形式-从而返回不兼容的函数签名。因此,在不止一种情况下,我很想找到一个好的答案来避免这种TS行为:(

typescript
1个回答
1
投票

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

Draft

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

© www.soinside.com 2019 - 2024. All rights reserved.