typescript - 从具有不同键的嵌套对象的值创建联合

标签 typescript

鉴于我有以下选项类型

interface Options {
  parent1: {
    child1: {
      foo: 'bar'
    }
  };
  parent2: {
    child2: {
      baz: 'daz'
    }
  };
}

在这种情况下,如何将它变成所有二级子属性值的联合

{ foo: 'bar' } | { baz: 'daz' }

我尝试了以下方法

type KnownOptions = Options[keyof Options][keyof Options[keyof Options]];

但这只有在二级子属性在所有顶级属性中都相同时才有效。例如。当我将 child2 重命名为 `child1

时它起作用了

Playground

最佳答案

您可以使用映射类型来获取嵌套类型:

type KnownOptions<T> = T extends {
  [k in keyof T]: {
    [k: string]: infer OptionValue
  }
} ? OptionValue : never

// Good:
const a: KnownOptions<Options> = { foo: 'bar' }
const b: KnownOptions<Options> = { baz: 'daz' }

// Expect errors:
const c: KnownOptions<Options> = { foo: 'bad value' }
const d: KnownOptions<Options> = { badKey: 'bar' }

Playground

这是一个通用类型,它接受具有两级键的类型。条件类型(由三元 T extends Type ? A : B 表示)表示“如果通用类型 T 是至少 2 级深度的对象,则返回第二级中每个级别的类型. 否则,返回never 类型,因为泛型类型无效。

infer OptionalValue 表示“无论此处是什么类型,都将其保存为 OptionValue”。在将多个类型保存到它之后,它由条件类型返回,创建每个类型的联合。

我不得不承认,我不完全确定为什么第一级 key 需要是 k in keyof T 但第二级可以只是 k: string .但是,这是我让它正常工作的唯一方法。

关于typescript - 从具有不同键的嵌套对象的值创建联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61281041/

相关文章:

typescript - 使用 Jest 正确模拟库/方法

Typescript 无法为函数对象推断出正确的参数类型

reactjs - typescript 使用传播运算符抛出错误

angular - 在 Angular 中使用 httpclient.post 发送和接收不同的类型

typescript - 为了将 main 与测试编译分开,需要设置哪些正确的 typescript 编译器 (tsc) 选项?

angular - 如何使用 typescript 修复 Angular 5 中的 ‘debounceTime & distinctUntilChanged | RxJS’ 错误

typescript - 扩展 ko.observable 或访问绑定(bind)到 observable 的 DOM 节点

javascript - 解构嵌套对象 es6

javascript - 在 typescript 中导出默认值后实例化对象返回错误

javascript - ActivatedRoute 的 Angular promise 不适用于 Typescript 等待