gpt4 book ai didi

typescript - 使用 typescript 中的变量修改对象属性

转载 作者:行者123 更新时间:2023-12-04 09:17:18 25 4
gpt4 key购买 nike

在 js 中,我有一个函数可以根据参数修改包含在对象列表中的对象的属性:

function edit(object, key, property, value){
object[key][property] = value;
}

我如何设法在 TypeScript 中执行相同的功能?

从现在开始我做了这个:

function edit(object: ObjectList, key: string, property: string, value: number){
object[key][property] = value;
}

但这不起作用,并给了我一个 Element 隐式地​​具有“any”类型,因为类型“string”的表达式不能用于索引类型“{ name: string;精通:数; parent_skill:数字; access_level:数字;成本:字符串;成本值:数字;背景颜色:数字[];字体颜色:数字[];描述:字符串;所需技能:数字[]; }'。在类型 '{ name: string; 上找不到参数类型为 'string' 的索引签名精通:数; parent_skill:数字; access_level:数字;成本:字符串;成本值:数字;背景颜色:数字[];字体颜色:数字[];描述:字符串;所需技能:数字[]; }'

我希望能够像这样调用函数:

edit(myObject, "first", "oneProperty", "newValue1");

结果将是我在 myObject 中的“第一个”项目的“oneProperty”属性将具有“newValue1”。

更多信息:我的对象列表

type SkillList = {
[key: string]: Skill;
};

我的目标

type Skill = {
name: string;
mastery: number;
parent_skill: number;
access_level: number;
cost: string;
cost_value: number;
background_color: number[];
font_color: number[];
description: string;
required_skills: number[];
};

最佳答案

答案将是一个通用函数:

代码

function edit<O extends ObjectList, K extends keyof O, P extends keyof O[K]>(object: O, key: K, property: P, value: O[K][P]){
object[key][property] = value;
}

Playground

解释

首先,我们有一个通用类型O,它让我们可以使用输入的对象类型,例如可能缩小 [key: string]: Skill;.

然后我们有泛型类型 K,它引用 O/object 中的所有键。

之后我们有了泛型 P,它引用了 object[key] 中的所有属性。

最后我们有 O[K][P] 告诉 typescript 使用 object[key][property] 的类型。这可能是最有用的部分,因为它防止用 number 覆盖 string,例如 edit(mySkillObject, "first", "name", "newValue1");

关于typescript - 使用 typescript 中的变量修改对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63161961/

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