Javascript 财产';日期';不存在于类型';{}{date:string;}';

Javascript 财产';日期';不存在于类型';{}{date:string;}';,javascript,typescript,query-string,Javascript,Typescript,Query String,一般来说,我对typescript和types还不熟悉,但这个错误让我很困惑。我使用npm模块查询字符串将查询字符串解析为键/值对对象。但我不确定设置返回值的最佳方式是什么查询字符串使用.parse()方法将返回键/值对的对象或空对象 示例: queryString: { date: string } | {} = queryString.parse(location.search); 当我尝试使用queryString.date访问属性时,我遇到以下错误:属性“date”在类型“{}}{d

一般来说,我对typescript和types还不熟悉,但这个错误让我很困惑。我使用npm模块
查询字符串
将查询字符串解析为键/值对对象。但我不确定设置返回值的最佳方式是什么<代码>查询字符串
使用
.parse()
方法将返回键/值对的对象或空对象

示例:

queryString: { date: string } | {} =  queryString.parse(location.search);
当我尝试使用
queryString.date
访问属性时,我遇到以下错误:
属性“date”在类型“{}}{date:string;}”上不存在。


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

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

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

只需将date作为可选属性即可

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

只需将日期设置为可选属性即可

queryString: { date?: string } =  queryString.parse(location.search);
不要设置任何内容——TypeScript将根据返回值自动推断类型

queryString =  queryString.parse(location.search);
TypeScript所说的是真的。如果某物是
{}
{date:string}
,则不能保证
.date
会存在。TypeScript尊重这一点,并适当地排除错误。这是所需的行为。

不要设置任何内容——TypeScript将根据返回值自动推断类型

queryString =  queryString.parse(location.search);

TypeScript所说的是真的。如果某物是
{}
{date:string}
,则不能保证
.date
会存在。TypeScript尊重这一点,并适当地排除错误。这是您想要的行为。

当您试图访问该属性时;transpiler不知道是要将该对象用作空对象,还是要将其用作带日期的对象

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

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

2:在使用过程中使用if 就这么简单

if(queryString.date !== undefined) {
   const date = queryString.date;
   //... Do stuff
}
3:(不建议)如果出于任何其他原因,您只是对它是否存在不感兴趣,您可以通过
as
keyworord强制transpiler将其视为一个或另一个

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

当您试图访问该财产时;transpiler不知道是要将该对象用作空对象,还是要将其用作带日期的对象

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

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

2:在使用过程中使用if 就这么简单

if(queryString.date !== undefined) {
   const date = queryString.date;
   //... Do stuff
}
3:(不建议)如果出于任何其他原因,您只是对它是否存在不感兴趣,您可以通过
as
keyworord强制transpiler将其视为一个或另一个

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

所以你说的是,因为对象可能是空的,transpiler将其视为空的?因为类型是duck类型的;Transpiler在不进行任何检查的情况下使用对象时将其视为同时存在:
属性“date”在类型“{}{date:string;}”上不存在
,因为它不能同时存在。这就是为什么您要么用
将其标记为可选,要么检查未定义(本质上,这将决定它是
{}
还是
{date:date}
那么您所说的是什么,因为对象可能是空的?transpiler将其视为空的?因为类型是duck类型;transpiler在使用对象时不进行任何检查:
属性“date”在类型“{}}{date:string;”上不存在“
,因为它不能同时存在。这就是为什么您可以用
将它标记为可选,或者检查未定义(本质上,这将决定它是
{}
还是
{date:date}