使用打字稿从对象数组创建对象
Use typescript to create object from array of objects
我有以下打字稿代码:
const a = [{ foo: 1 }, { bar: '2' }]
我希望使用 a
创建以下形式的对象:
const b = {
foo: 1,
bar: '2'
}
并且 b
的类型应该等同于类型:
type EquivalentType = {
foo: number
bar: string
}
这可以不用转换吗?如何做到这一点?
// You might be able to simplify this
type TypeFromLiteral<T> = T extends string ? string : T extends number ? number : T extends boolean ? boolean : never;
// The "as const" part is important so that we can process the types
const a = [{ foo: 1 }, { bar: '2' }] as const;
// Get the final type
type ObjectUnion = typeof a[number];
type NewType = { [T in ObjectUnion as keyof T]: TypeFromLiteral<T[keyof T]> };
// By itself, this will get the correct value. However, we need to process the type separately and cast it to get what you want.
const b = Object.assign({}, ...a) as NewType;
当然有。此解决方案不需要像@Vija02 那样的 as const
(尽管如果需要就完全没问题)。
映射数组中所有可能的键,然后使用 Extract
:
仅获取该键的类型
type CreateFrom<T extends ReadonlyArray<unknown>> = { [K in keyof T[number]]-?: Extract<T[number], { [_ in K]: any }>[K] };
那么您只需在假设的函数中使用此类型即可:
function createFrom<T extends ReadonlyArray<unknown>>(list: T): CreateFrom<T> {
// ... for you to implement!
}
请注意,您可能需要转换 return 类型。我认为 TypeScript 不会对此感到满意。
最后,this 是一个演示解决方案的游乐场。
我有以下打字稿代码:
const a = [{ foo: 1 }, { bar: '2' }]
我希望使用 a
创建以下形式的对象:
const b = {
foo: 1,
bar: '2'
}
并且 b
的类型应该等同于类型:
type EquivalentType = {
foo: number
bar: string
}
这可以不用转换吗?如何做到这一点?
// You might be able to simplify this
type TypeFromLiteral<T> = T extends string ? string : T extends number ? number : T extends boolean ? boolean : never;
// The "as const" part is important so that we can process the types
const a = [{ foo: 1 }, { bar: '2' }] as const;
// Get the final type
type ObjectUnion = typeof a[number];
type NewType = { [T in ObjectUnion as keyof T]: TypeFromLiteral<T[keyof T]> };
// By itself, this will get the correct value. However, we need to process the type separately and cast it to get what you want.
const b = Object.assign({}, ...a) as NewType;
当然有。此解决方案不需要像@Vija02 那样的 as const
(尽管如果需要就完全没问题)。
映射数组中所有可能的键,然后使用 Extract
:
type CreateFrom<T extends ReadonlyArray<unknown>> = { [K in keyof T[number]]-?: Extract<T[number], { [_ in K]: any }>[K] };
那么您只需在假设的函数中使用此类型即可:
function createFrom<T extends ReadonlyArray<unknown>>(list: T): CreateFrom<T> {
// ... for you to implement!
}
请注意,您可能需要转换 return 类型。我认为 TypeScript 不会对此感到满意。
最后,this 是一个演示解决方案的游乐场。