Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Typescript以编程方式设置复杂对象属性值_Javascript_Reactjs_Typescript - Fatal编程技术网

Javascript Typescript以编程方式设置复杂对象属性值

Javascript Typescript以编程方式设置复杂对象属性值,javascript,reactjs,typescript,Javascript,Reactjs,Typescript,ReactJS和TypeScript。我的总体目标是创建一个事件处理程序函数,该函数接受输入元素select、input等的名称,并基于属性名称和事件值设置复杂对象的属性 本质上,类似于: 然而,在我的例子中,我使用的是TypeScript,而且我还使用了一个相当复杂的对象 下面是一些测试代码:参考 TypeScript抱怨: 类型为“state.fullName”的参数不能分配给的参数 输入“联系人信息|国家|州|旅行日期”| travelerInfo | paymentInfo | cove

ReactJS和TypeScript。我的总体目标是创建一个事件处理程序函数,该函数接受输入元素select、input等的名称,并基于属性名称和事件值设置复杂对象的属性

本质上,类似于:

然而,在我的例子中,我使用的是TypeScript,而且我还使用了一个相当复杂的对象

下面是一些测试代码:参考

TypeScript抱怨:

类型为“state.fullName”的参数不能分配给的参数 输入“联系人信息|国家|州|旅行日期”| travelerInfo | paymentInfo | coverageType | tripInfo| setQuoteInfo'.ts2345

这项工作:

setProperty(initialQuoteInfo, "state", {
  fullname: "Virginia",
  abbreviation: "VA",
});
我可以想出几种方法来立即处理这个问题。一种方法是解析名称,如果它有一个点,那么进行一些时髦的设置。另一种可能是创建另一个函数,该函数接受解析后的名称,并执行与setProperty函数基本相同的操作

我忍不住认为可能会有一种更优雅、更实用的方法,所以我非常感谢您的帮助

function setProperty(obj: object, key: string, value: any) {
    const propertyPath = key.split(".");
    const propertyName = propertyPath.pop();
    const baseObj = propertyPath.reduce((t: any, c) => t[c], obj);
    baseObj[propertyName] = value;
}
通过以下方式进行测试:

setProperty(initialQuoteInfo, "country", "United Kingdom");
setProperty(initialQuoteInfo, "state.fullname", "Virginia");
setProperty(initialQuoteInfo, "coverageType", CoverageType.Standard);
setProperty(initialQuoteInfo, "travelerInfo.0.dob", new Date(1980, 1, 1));

我承认它不符合您的“优雅和实用”标准,但它符合您的要求,我认为它很容易理解。

也许这会有所帮助:比我所能创造的更优雅和实用。谢谢
setProperty(initialQuoteInfo, "state", {
  fullname: "Virginia",
  abbreviation: "VA",
});
function setProperty(obj: object, key: string, value: any) {
    const propertyPath = key.split(".");
    const propertyName = propertyPath.pop();
    const baseObj = propertyPath.reduce((t: any, c) => t[c], obj);
    baseObj[propertyName] = value;
}
setProperty(initialQuoteInfo, "country", "United Kingdom");
setProperty(initialQuoteInfo, "state.fullname", "Virginia");
setProperty(initialQuoteInfo, "coverageType", CoverageType.Standard);
setProperty(initialQuoteInfo, "travelerInfo.0.dob", new Date(1980, 1, 1));