gpt4 book ai didi

typescript 类型任意数量的通用字段

转载 作者:搜寻专家 更新时间:2023-10-30 21:36:22 24 4
gpt4 key购买 nike

首先,我不是 100% 确定我想做的事情是否可行,但我会尽量描述最好的情况。

interface Property<T> {
value: T
}

interface PropertyBag {
[key: string]: Property<???>
}

function toPlainObject(props: PropertyBag): ??? {
return Object.keys(props)
.reduce((acc, key) => Object.assign(acc, { [key]: props[key].value }), {})
}

一个演示我想做什么的例子:

interface Person {
name: string
age: number
}

const name: Property<string> = { value: 'John Doe' }
const age: Property<number> = { value: 35 }

const props: PropertyBag = { name, age }

const person: Person = toPlainObject(props)

我想知道的是如何输入 toPlainObjectPropertyBag 的返回类型(类型是 ???)。这甚至可以使用 TS 吗?

最佳答案

如果您向 PropertyBag 添加一个额外的通用参数并改为使用映射类型,您可以做一些接近于此的事情:

interface Property<T> {value: T }
type PropertyBag<T> = { [P in keyof T]: Property<T[P]> }

基本上 T 将充当属性包的属性名称和属性类型的持有者。您可以像这样显式定义一个实例:

const name: Property<string> = { value: 'John Doe' }
const age: Property<number> = { value: 0 }
let bag : PropertyBag<{ name : string, age: number}> = { age, name };

interface Person { name : string, age: number}
let personBag : PropertyBag<Person > = { age, name };

您还可以创建一个有助于类型的函数,这样您就不必手动指定所有属性和类型

function createBag<T>(props: PropertyBag<T>):PropertyBag<T> {
return props;
}


const name: Property<string> = { value: 'John Doe' }
const age: Property<number> = { value: 0 }
let bag = createBag({ age, name }); // infered as PropertyBag<{age: number;name: string;}>

您当然可以将其用于您的功能:

function toPlainObject<T>(props: PropertyBag<T>): T {
return (Object.keys(props) as Array<keyof T>)
.reduce((acc, key) => Object.assign(acc, { [key]: props[key].value }), {}) as any;
}

const name: Property<string> = { value: 'John Doe' }
const age: Property<number> = { value: 0 }

const person:Person = toPlainObject({ name, age })

关于 typescript 类型任意数量的通用字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51308712/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com