是否可以从对象类型创建联合键值类型?
Is it possible to create union key value type from object type?
例如我有对象类型
type FooBar = {
foo: number,
bar: string
}
我想创建这种类型
{key: "foo", value: number} | {key: "bar", value: string}
我可以创造
{key: keyof FooBar}
和
{value: FooBar[keyof FooBar]}
但我想以某种方式将它们组合起来。
您可以使用映射类型执行此操作。将每个键映射到 {key: <keyname>, value: <keytype>}
类型,然后使用 keyof
:
构建所有键的联合
type FooBar = {
foo: number,
bar: string
}
type KV<T> = {[K in keyof T]: {key: K, value: T[K]}}[keyof T];
declare const test: KV<FooBar>;
// `test` has type: {key: "foo", value: number} | {key: "bar", value: string}
受 CRice's 启发,以下代码片段也支持嵌套对象:
type ObjectDeepValues<OBJ_T> = {
[K in keyof OBJ_T]: OBJ_T[K] extends Record<PropertyKey, unknown>
? ObjectDeepValues<OBJ_T[K]>
: OBJ_T[K]
}[keyof OBJ_T];
const obj = {
x: 5,
b: true,
nestedObj: {
a: "hi",
},
} as const;
type t1 = ObjectDeepValues<typeof obj>; // true | 5 | "hi"
例如我有对象类型
type FooBar = {
foo: number,
bar: string
}
我想创建这种类型
{key: "foo", value: number} | {key: "bar", value: string}
我可以创造
{key: keyof FooBar}
和
{value: FooBar[keyof FooBar]}
但我想以某种方式将它们组合起来。
您可以使用映射类型执行此操作。将每个键映射到 {key: <keyname>, value: <keytype>}
类型,然后使用 keyof
:
type FooBar = {
foo: number,
bar: string
}
type KV<T> = {[K in keyof T]: {key: K, value: T[K]}}[keyof T];
declare const test: KV<FooBar>;
// `test` has type: {key: "foo", value: number} | {key: "bar", value: string}
受 CRice's
type ObjectDeepValues<OBJ_T> = {
[K in keyof OBJ_T]: OBJ_T[K] extends Record<PropertyKey, unknown>
? ObjectDeepValues<OBJ_T[K]>
: OBJ_T[K]
}[keyof OBJ_T];
const obj = {
x: 5,
b: true,
nestedObj: {
a: "hi",
},
} as const;
type t1 = ObjectDeepValues<typeof obj>; // true | 5 | "hi"