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