Typescript 类型';字符串';不可分配给类型';弦乐;编号';。ts(2322)

Typescript 类型';字符串';不可分配给类型';弦乐;编号';。ts(2322),typescript,Typescript,我是typescript新手,正在尝试找出如何处理此错误。我明白为什么会这样,但我找不到正确的方法来处理 类型数据={ 名称:string 年龄:数目 } 类型ValueOf=T[keyof T] 常量数据:数据={ 名字:“杰克”, 年龄:33岁, } 函数更改(名称:keyof数据,值:ValueOf):ValueOf{ 数据[名称]=值//错误 返回数据[名称] } 错误: 类型“string | number”不可分配给类型“string&number” 类型“string”不可分配给

我是typescript新手,正在尝试找出如何处理此错误。我明白为什么会这样,但我找不到正确的方法来处理

类型数据={
名称:string
年龄:数目
}
类型ValueOf=T[keyof T]
常量数据:数据={
名字:“杰克”,
年龄:33岁,
}
函数更改(名称:keyof数据,值:ValueOf):ValueOf{
数据[名称]=值//错误
返回数据[名称]
}
错误

类型“string | number”不可分配给类型“string&number”

类型“string”不可分配给类型“string&number”

类型“string”不可分配给类型“number”


代码不起作用的原因涉及到对类型系统的一点理解

虽然代码中的表达式
data[name]
的类型为
string | number
,但分配给此表达式的任何值都必须同时分配给
string
number
,或者类型为
string&number
。这显然是不可能的

为了解决此问题,
change()
应该是一个通用函数,它允许您根据
name
的特定值约束
数据[name]
值的类型:

type Data = {
  name: string
  age: number
}

const data: Data = {
  name: 'Jack',
  age: 33,
}

function change<K extends keyof Data>(name: K, value: Data[K]): Data[K] {
  return data[name] = value
}

change('name', 'Jill') // infers change<'name'>, value: string
change('age', 21) // infers change<'age'>, value: number
类型数据={
名称:string
年龄:数目
}
常量数据:数据={
名字:“杰克”,
年龄:33岁,
}
函数更改(名称:K,值:数据[K]):数据[K]{
返回数据[名称]=值
}
change('name','Jill')//推断更改,值:string
change('age',21)//推断变化,值:number

太棒了!非常感谢你!