我正在尝试编写一个 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
为空。
看看这个:
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 需要特定的编排来理解你想用它的类型做什么,但最终非常强大。