我正在尝试创建一个"FormField"泛型类型,它将采用另一种类型,并且只接受该类型的属性名称/值元组+一些属性,如"checked"。
示例:
const formProperties: FormField<User> = [{name: "name", value: "Toto", checked: false}, {name: "age", value: 30, checked: true}]` with User defined like this : `interface User { name: string; age: number;}` or even `const formProperties: FormField<House> = [{name: "width", value: 100, checked: true}, {name: "height", value: 50, checked: false}]` with House : `interface House { width: number; height: number; }
我知道我可以用
{name: string; value: string | number | CustomType }[]
但是我不知道"值"的类型。
我也尝试了一些Map类型的方法,但也没有成功。
type FormField<T> = {[Property in keyof T]: T[Property]};
1条答案
按热度按时间hfyxw5xn1#
溶液
这里发生了什么?
为了简单起见,我将单个列表项提取到它自己的类型
FormFieldItem
中,这也使得将来扩展它变得更容易。FormFieldItem
采用两个通用参数:T
:用于Map指定Key
类型的整个对象Key
:Mapkey
属性的类型和value
属性的类型我们可以在
FormField
类型中使用FormFieldItem
类型来首先构造一个新对象,在该对象中我们将对象(T
)的每个键Map到相应的FormFieldItem
。然后我们可以将所有keyof T
Map到所创建的对象上,以获得所有可能的FormFieldItem
的并集。最后我们期望这些并集的列表(最后的[]
)。有用吗?
您可以使用描述中提供的值对此进行测试。Interactive TypeScript Playground链接