属性 'date' 在类型 '{} | 上不存在{ 日期:字符串; }'

Property 'date' does not exist on type '{} | { date: string; }'

总的来说,我对打字稿和类型还是陌生的,但这个错误真的让我很困惑。我正在使用 npm 模块 query-string 将查询字符串解析为 key/value 对的对象。但我不确定设置 return 值的最佳方式是什么。 query-string 使用 .parse() 方法将 return 一个 key/value 对的对象或一个空对象。

示例:

queryString: { date: string } | {} =  queryString.parse(location.search);

当我尝试使用 queryString.date 访问 属性 时出现此错误:Property 'date' does not exist on type '{} | { date: string; }'

我确定我在这里遗漏了一些基本的东西,我就是想不通。

您也将 queryString 属性 声明为空对象 {}。简单地说,{} 没有 属性 date.

只需将 日期 设为可选 属性。

queryString: { date?: string } =  queryString.parse(location.search);

不要设置任何内容 -- TypeScript 将根据 return 值自动推断类型。

queryString =  queryString.parse(location.search);

TypeScript 所说的是真的。如果某物是 {}{date: string},则无法保证 .date 会存在。 TypeScript 尊重这一点并适当地出错。这是期望的行为。

当您尝试访问 属性; transpiler 不知道 是否要将对象用作空对象或带日期的对象。

有几种方法可以解决这个问题:

1: queryString: { date?: string } = queryString.parse(location.search); 从本质上讲,这意味着该对象可以具有 date 属性 但这不是必需的。如果您希望 queryString.date 是正确的 dateundefined

,请使用此选项

2: 用 if 包围你的用法 就这么简单。

if(queryString.date !== undefined) {
   const date = queryString.date;
   //... Do stuff
}

3:(不建议)如果出于任何其他原因您只是对它是否存在不感兴趣,您可以通过 as 关键字[=18= 强制转译器将其视为一个或另一个]

const myDate: Date = (queryString as {date: Date}).date