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

2024-01-26

我有这个辅助函数:

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;
}

并以这种方式使用:

Helpers.getAndAssignToObject<BlockingConfig>(Components.BlockingRules, blockingData);

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

删除它时出现的错误是:

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

我不知道如何解决它。我试图给予dataKey方式keyof T但没有成功。


你需要断言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;
}

操场 https://www.typescriptlang.org/play/#code/CYUwxgNghgTiAEYD2A7AzgF3gQQA64GUMkYoBzEALngG8AoeeCjAHgBUA+ACgGtqoUATwCU1AAowkAWwCWaEOw4BuOgF86UNIJRh4AMwCuOjDNRMQGbCmDY0aGWRRskAeQBGAK3CtOvEIOpMGBkUMgAaeCRPb2dbe0dqNlF4CWk5BU5aBkRUTHhgKAwoeABeeCgAdygZLDxCYlIKADpmRT8RFUYudy8wDCaefzQuAqLhcrQcGFJBFkHBJD14TmEmvRIAUSgwAAsRwqgAaX9SjizGRijejFi7BxQAbVGj-wBdUvyDp4PjwVfO+CqYQqbJwDAGGAoT5FFTqOjMKw2O6OZw9bxcABEGIi9EYUGoAEY1MIgA

解释了这不是默认值的原因here https://stackoverflow.com/questions/55012174/why-doesnt-object-keys-return-a-keyof-type-in-typescript/55012175#55012175。基本上的想法是,例如objectToAssign可以有更多的属性keyof T会建议,这可能会导致运行时错误。在这种情况下,您将把这些额外的键复制到data这在这个函数中不是问题,但可能会在其他地方引起问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐