为了一个表单生成器,我正在尝试为嵌套对象和对象数组获得类型安全性。我希望名称属性的值是它所属对象的键。
因此,在下面的示例中,name.name 的值必须为 "name"。
对于数组,对象的名称必须是嵌套在 choices 中的类型。因此,具有名称为 "parentOption" 的对象和具有名称为 "code" 的选项。
对于嵌套对象,它必须一直嵌套到最后一个属性,并且我希望对象属性和名称被输入。我的意思是,
Position > Location > x | y | z 是唯一允许提供的名称。
我希望这有点意义。使用 T 的 Keyof,我只能为表单对象的第一层级进行输入,因此问题、选择和位置都已输入。但是对于更深层次,我必须使用递归,但迄今为止我没有成功,谢谢!
因此,在下面的示例中,name.name 的值必须为 "name"。
对于数组,对象的名称必须是嵌套在 choices 中的类型。因此,具有名称为 "parentOption" 的对象和具有名称为 "code" 的选项。
对于嵌套对象,它必须一直嵌套到最后一个属性,并且我希望对象属性和名称被输入。我的意思是,
Position > Location > x | y | z 是唯一允许提供的名称。
我希望这有点意义。使用 T 的 Keyof,我只能为表单对象的第一层级进行输入,因此问题、选择和位置都已输入。但是对于更深层次,我必须使用递归,但迄今为止我没有成功,谢谢!
type FormSchema = {
name: string
choices: { choice: string }[]
position: { location: { x: number, y: number, z: number } }
}
type TextField = {
name: string
label: string
}
const form = {
name: {
name: "name", // name must be name
label: "Question A"
},
choices: [
{
name: "choice", //name must be choice
label: "Choice"
}
],
position: { //this has to be position
location: { //this has to be location
x: {name: "x", label: "X"}, //name must be x
y: {name: "y", label: "Y"}, //name must be y
z: {name: "z", label: "Z"}, //name must be z
},
}
}
我添加了一张图片,以便更清楚地说明我的需求。所有与类型相连接的属性都应该自动定义类型。但是,它必须是动态的,以便任何使用的类型都可以自动定义类型。