TypeScript: "catch"并在条件中显式处理未解析的泛型?

标签 typescript

一段时间以来,我一直在努力寻找一个现实生活中但不太复杂的示例。我希望这能奏效。

我们正在与 immer 合作, 输出 Draft看起来像这样的类型(我稍微简化了一下):

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

因此,该类型仅删除了 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 a 参数不兼容。

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

最佳答案

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

function genericFn<T>(initialParam: Data<T>) { 
  function test(param: Draft<Data<T>>) { 
    // ...
  }

  const draft: Draft<Data<T>> = initialParam as Draft<Data<T>>;
  test(draft);
  return test;
}

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

关于TypeScript: "catch"并在条件中显式处理未解析的泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59626748/

相关文章:

typescript - 在 Typescript 中使用 forEach 时如何分配类型(未知类型的对象)

c# - Nuget 包 Microsoft.TypeScript.MSBuild 在 Dockerfile 中失败

angular - 如何访问 Angular 2 组件和服务中的常量?

html - React Router 只有一个链接可以工作 Github Pages

typescript - 从方法访问 vue 组件中的数据

javascript - 如何将 jquery 类型导入到 typescript

typescript - typescript的不同导入导出形式

Angular 2在路线更改时滚动到顶部

typescript - 其余元素必须在元组类型的最后

javascript - Material Design Table 不接受数据源对象