Javascript 财产';日期';不存在于类型';{}{date:string;}';
一般来说,我对typescript和types还不熟悉,但这个错误让我很困惑。我使用npm模块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
查询字符串将查询字符串解析为键/值对对象。但我不确定设置返回值的最佳方式是什么<代码>查询字符串
使用.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}