类型“string”不能用于索引类型“未知||” 或者如何让打字稿分配 Type[key] = SameType[key]

dis*_*nte 4 typescript

我有这个辅助函数:

getAndAssignToObject<T>(key: string, objectToAssign: T): Promise<T> {
  const data = await AppStorage.get<T>(key);
  Object.keys(data).forEach( dataKey => {
    // @ts-ignore
    objectToAssign[dataKey] = data[dataKey];
  });

  return data;
}
Run Code Online (Sandbox Code Playgroud)

并以这种方式使用:

Helpers.getAndAssignToObject<BlockingConfig>(Components.BlockingRules, blockingData);
Run Code Online (Sandbox Code Playgroud)

它按预期工作,但正如你所看到的,我有一个@ts-ignore我真的很想删除的。

删除它时出现的错误是:

元素隐式具有“any”类型,因为“string”类型的表达式不能用于索引类型“unknown”。在类型“未知”.ts(7053) 上找不到带有“字符串”类型参数的索引签名

我不知道如何解决它。我尝试给出dataKey类型keyof T,但没有成功。

Tit*_*mir 5

您需要断言Object.keys返回Array<keyof T>not Array<string>

async function getAndAssignToObject<T>(key: string, objectToAssign: T): Promise<T> {
  const data = await AppStorage.get<T>(key);
  (Object.keys(data) as Array<keyof T>).forEach(dataKey => {
    objectToAssign[dataKey] = data[dataKey];
  });

  return data;
}

Run Code Online (Sandbox Code Playgroud)

操场

这里解释了这不是默认值的原因。基本上,这个想法是,例如,objectToAssign可以具有比keyof T建议更多的属性,这可能会导致运行时错误。在这种情况下,您将复制这些额外的键,data这在此功能中不是问题,但可能会在其他地方引起问题。