首页 > 解决方案 > 类型“字符串”不可分配给类型“字符串和数字”。ts(2322)

问题描述

我是打字稿的新手,并试图弄清楚如何处理这个错误。我明白为什么会这样,但找不到正确的方法来处理这个问题

type Data = {
    name: string
    age: number
}

type ValueOf<T> = T[keyof T]

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

function change(name: keyof Data, value: ValueOf<Data>): ValueOf<Data> {
    data[name] = value // error
    return data[name]
}

错误

键入'字符串 | number' 不可分配给类型 'string & number'。

类型“字符串”不可分配给类型“字符串和数字”。

类型“字符串”不可分配给类型“数字”。

标签: typescript

解决方案


您的代码不起作用的原因涉及对类型系统的一点了解。

虽然data[name]代码中的表达式是 type ,但分配给此表达式的任何值string | number必须可分配给and或 type 。这显然是不可能的。 string numberstring & number

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

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

推荐阅读