typescript 如何获得嵌套对象的值类型的并集?

xzabzqsa  于 2023-03-09  发布在  TypeScript
关注(0)|答案(1)|浏览(206)

给定这样的对象:

const deepNestedObject = {
  a: "value",
  b: {
    c: "nestedvalue"
    d: {
       e: "deepNestedValue"
    }
  }
}

如何生成一个仅包含边的非对象值的并集类型

type EdgeValueUnion = DeepValueOf<typeof deepNestedObject>; // Should equate to "value" | "nestedValue" | "deepNestedValue"

到目前为止,我已经尝试过了:

type ValueOf<T> = T[keyof T];

type DeepValueOf<
  T extends Record<string, unknown>,
  Key = keyof T
> = Key extends string
  ? T[Key] extends Record<string, unknown>
    ? DeepValueOf<T[Key]>
    : ValueOf<T>
  : never;

但它并不完全正确,因为它仍然允许树中的对象值通过。

const edgeValue: EdgeValueUnion = deepNestedObject.b;

TS沙盒示例

f0brbegy

f0brbegy1#

从值中提取所有字符串:

type EdgeValueUnion = Extract<DeepValueOf<typeof deepNestedObject>, string>;

您还需要一个constAssert,以确保字符串被推断为文本,而不是一般的string类型:

const deepNestedObject = {
    a: "value",
    b: {
        c: "nestedvalue",
        d: {
            e: "deepNestedValue",
        },
    },
} as const;

Playground

相关问题