给定这样的对象:
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沙盒示例
1条答案
按热度按时间f0brbegy1#
从值中提取所有字符串:
您还需要一个constAssert,以确保字符串被推断为文本,而不是一般的
string
类型:Playground