错误 TS2339:类型“”上不存在属性“包含”
Posted
技术标签:
【中文标题】错误 TS2339:类型“”上不存在属性“包含”【英文标题】:error TS2339: Property 'includes' does not exist on type ''错误 TS2339:类型“”上不存在属性“包含” 【发布时间】:2018-11-17 14:17:55 【问题描述】:我遇到以下错误:
错误 TS2339:类型“”上不存在属性“includes”。
当尝试检查用户名是否被使用时。 (当我评论这个错误时,它非常有效,然后从 ng serve 开始,然后取消注释它,但我无法启动我的服务错误,这就是我使用这个技巧的原因)
服务:
isUsernameAvailable()
const users = [];
return new Promise(function(resolve, reject)
firebase.database().ref('users').orderByKey().once('value').then(snapshot =>
snapshot.forEach(childSnapshot =>
if(childSnapshot.val().username)
users.push(childSnapshot.val().username);
)
resolve(users);
)
);
组件:
async checkUsername()
const username=this.signupForm.get('username').value;
const usernames =await this.authService.isUsernameAvailable();
if(usernames.includes(username))
this.usernameAvailable=false;
else
this.usernameAvailable=true;
我看到一些人在使用 String[] 类型时遇到了类似的错误,问题出在 es2017 的 tsconfig 中,但我已经有了:
"lib": [
"es2017",
"dom"
]
我哪里错了?
【问题讨论】:
不要使用new Promise
。 ***.com/q/23803743/34397
您应该注释您的函数以声明它们实际返回的内容。
你应该使用map()
& filter()
。
好的,谢谢@SLaks 我是 ATM 的初学者,我会尝试你的建议。我应该删除我的主题还是我的问题对某人有用?
【参考方案1】:
首先在这种情况下,new Promise
的使用是不必要的,你可以只返回承诺。其次,您需要将users
正确键入为string[]
,这将有助于推断返回类型。
isUsernameAvailable()
return firebase.database().ref('users').orderByKey().once('value').then(snapshot =>
const users:string[] = [];
snapshot.forEach(childSnapshot =>
if (childSnapshot.val().username)
users.push(childSnapshot.val().username);
)
return users;
)
【讨论】:
一切正常,谢谢。有趣(愚蠢?)的事情是我使用了一个 Promise,因为我遇到了一些异步问题,我认为我必须添加一个 Promise 才能使用 async/await....once
已经返回了一个承诺,我们可以使用 then
链接事物以上是关于错误 TS2339:类型“”上不存在属性“包含”的主要内容,如果未能解决你的问题,请参考以下文章
TypeScript:TS2339 错误——“对象”类型上不存在属性