“T”类型是通用的,只能为阅读建立索引。ts(2862)

问题描述 投票:0回答:1

我正在尝试编写一个 TypeScript 函数来按需创建字段。到目前为止,这是:

export function lazy_field<T extends Record<string,unknown>,FIELD>(
  target:T,
  name:string,
  init:()=>FIELD
){
  const exists=target[name]
  if (exists!==undefined)
    return exists
  const new_val=init()
  target[name]=new_val
  return new_val
}

我的问题是

target[name]=new_val
行有这个错误:

Type 'T' is generic and can only be indexed for reading.ts(2862)

此错误是什么以及如何修复它?

tsconfig.json
为空。

typescript
1个回答
0
投票

看看这个:

export function lazy_field<T, K extends keyof T, FIELD extends T[K]>(
  target: T,
  name: K,
  init: ()=>FIELD
){
  const exists=target[name]
  if (exists!==undefined)
    return exists
  const new_val=init()
  target[name]=new_val
  return new_val
}

粗略地说,“对于类型 T,其中 K 是该类型的键,FIELD 是 T[K] 的类型”。您的游乐场示例似乎适用于此。有时 Typescript 需要特定的编排来理解你想用它的类型做什么,但最终非常强大。

© www.soinside.com 2019 - 2024. All rights reserved.