TypeScript为从类型未知的API获取的对象定义接口/类型,但尝试分配定义的类型

llmtgqce  于 2023-01-06  发布在  TypeScript
关注(0)|答案(1)|浏览(186)

还在学习TypeScript,所以如果我描述得不正确,请原谅。
我有一个函数,它获取一些数据并返回一个嵌套的对象,我用forEach循环该对象。我已经为我使用的对象中的每个值声明了类型,但仍然得到一个错误:
类型""的参数(值:RaceInfo)=〉void "无法赋值给类型为""的参数(值:未知,索引:编号,数组:unknown [])=〉void "。参数" value "和" value "的类型不兼容。类型" unknown "不能赋给类型" RaceInfo "。ts(2345)
请参阅下面的代码:

interface Selection {
    date: string;
    time: string;
    venue: string;
}
interface RaceInfo {
     codes: {
         race_sc: string;
     };
     details: {
         venue: string;
  };
}
export default async function getSC(selection: Selection) {
  let sc;

  await fetch(`URL`,{method: "GET",})
    .then((response) => response.json())
    .then((data) => {
      if (data.success) {
        Object.values(data.races).forEach((value: RaceInfo) => {
          if (
            value.codes.race_sc.slice(-4) === selection.time &&
            value.details.venue === selection.venue
          ) {
            sc = value.codes.race_sc;
          }
        });
      } else {
        console.log("Could not fetch the races");
      }
    })
    .catch((error) => {
      console.log("Error:", error);
    });

  return sc;
}

我已经找到了一种方法,通过改变实际的循环代码,这工作得很好,但这是一种可接受的编写严格TypeScript的方法吗?因为我不必为返回的对象声明类型/接口。

for (const key of Object.keys(data.races)) {
     const value = data.races[key];
     if (
        value.codes.race_sc.slice(-4) === selection.time &&
        value.details.venue === selection.venue
     ) {
        sc = value.codes.race_sc;
        }
     }
hyrbngr7

hyrbngr71#

value的上下文类型为unknown。为它指定RaceInfo的显式类型将破坏回调的类型安全。就编译器而言,unknown类型的任何值都可以传递到回调中。该错误阻止您将定义 * 更改a为需要RaceInfo类型值的函数。
如果您确定Object.values(data.races)只能是RaceInfo[]类型,则需要使用 type assertion

(Object.values(data.races) as RaceInfo[]).forEach((value) => /* ... */)

相关问题