首页 >web前端 >js教程 >递归条件类型

递归条件类型

Barbara Streisand
Barbara Streisand原创
2024-12-01 03:00:13471浏览

Recursive Conditional Types

假设您有一个 for in 循环,突然意识到您的变量类型是字符串而不是字符串文字联合类型。因此,当您使用 tsc 编译应用程序时,您会遇到这个丑陋的错误,并且令人烦恼的是您最喜欢的 IDE 很可能会在其冲刺的顶部尖叫:

[!注意]

只是为了向您展示它是如何完成的,我正在使用 os.cpus。在那里我尝试循环 cpu.times 这是一个对象。您可以在这里找到更多信息。

所以这是有问题的代码:

使固定

  1. 我们需要提取逻辑CoreInfo.times 中的键并从中创建一个新类型。
  2. 然后我们可以利用类型断言来让 TS 相信一切都很酷,我们知道这里发生了什么。

所以让我们开始吧,第一部分我们需要为自己创建一个自定义实用程序类型,这是我们最终的实用程序类型的样子:

让我们来分解一下:

  1. T 扩展对象 ? ...:never 告诉 TS 递归遍历嵌套对象类型 T 并提取 T 内特定键的键(如果 T 是对象)。
  2. [T 键中的 T 键]-?是一个“映射类型”,它在这里特别有用,因为我们不知道传递给该实用程序类型的对象内的键的名称。在这里,您将逻辑核心信息传递给它或任何其他对象,然后它迭代键以从中创建一个新类型。

    还有-?是否可以删除可选性,以便我们拥有所有键的字符串文字联合类型。换句话说, { keyName?: string } 将被视为 { keyName: string }.

  3. (TKey extends K ? keyof T[TKey] : never) 检查迭代中的当前键是否与传递的键 (K) 匹配,如果是,则将其中的所有键提取为字符串文字联合类型并归还它。否则它什么也不返回。

  4. 然后,如果步骤 3 没有结果,它将递归地在 T[Tkey] 上应用此实用程序类型,这样我们的实用程序函数也适用于嵌套对象。这通常称为“递归条件类型”。

  5. 最后我们要求它取映射类型生成的所有类型的并集。简而言之,我们正在展平嵌套结构。

现在是时候使用它了:

参考号

  • 嵌套对象类型的 TypeScript keyof。

以上是递归条件类型的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn