typescript React:类型“string”不能赋给类型“never”

iecba09b  于 2023-02-13  发布在  TypeScript
关注(0)|答案(2)|浏览(587)

描述:我正在尝试使用来自表单的属性值更新我的useStatenewCase
问题:赋值导致错误:类型'string'不能赋值给类型'never',我不知道如何修复它。
下面是case对象的接口:

export interface ICases {
  materials: Material[]
  finalActivity: boolean
  existingCase: boolean
  timestamp: Timestamp
  description: string
  userId: string
  caseName: string
  geoLocation: string
  done: boolean
  id: string
  parentActivityID: string
  first: boolean
}

下面是与AddCase模态相关的代码。

const [newCase, setNewCase] = useState<ICases>()

  const updateCase = (key: keyof ICases, value: string) => {
    const updatedCase = newCase ? { ...newCase } : ({} as ICases)
    updatedCase[key] = value
    setNewCase(updatedCase)
  }
gudnpqoy

gudnpqoy1#

您的问题是keyof中的键不一定有字符串值。要解决这个问题,我们可以只获取具有字符串值的键。

// https://stackoverflow.com/a/54520829/6911703
type KeysMatching<T, V> = {[K in keyof T]-?: T[K] extends V ? K : never}[keyof T];

const updateCase = (key: KeysMatching<ICases, string>, value: string) => {
  const updatedCase = newCase ? { ...newCase } : ({} as ICases)
  updatedCase[key] = value
  setNewCase(updatedCase)
}

或者,如果希望value与键的类型匹配,可以执行以下操作:

const updateCase = <K extends keyof ICases>(key: K, value: ICases[K]) => {
  const updatedCase = newCase ? { ...newCase } : ({} as ICases)
  updatedCase[key] = value
  setNewCase(updatedCase)
}
a5g8bdjr

a5g8bdjr2#

出现此错误的原因是,您尝试将字符串值分配给Material[]Timestampbooleannumber类型的属性,但这是不可能的。若要解决此问题,需要将value参数转换为正确的类型,然后再将其分配给updatedCase对象。例如,可以使用switch语句根据key参数确定正确的类型:

const updateCase = (key: keyof ICases, value: string) => {
    const updatedCase = newCase ? { ...newCase } : ({} as ICases)
    switch (key) {
        case 'materials':
            updatedCase.materials = value as Material[]
            break
        case 'finalActivity':
            updatedCase.finalActivity = value === 'true'
            break
        case 'existingCase':
            updatedCase.existingCase = value === 'true'
            break
        case 'timestamp':
            updatedCase.timestamp = value as Timestamp
            break
        case 'done':
            updatedCase.done = value === 'true'
            break
        default:
            updatedCase[key] = value
    }
    setNewCase(updatedCase)
}

注意:这只是解决问题的一种方法。根据您的特定用例,您可能需要以不同的方式处理强制转换。

相关问题