【问题标题】: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 Promisestackoverflow.com/q/23803743/34397
  • 您应该注释您的函数以声明它们实际返回的内容。
  • 你应该使用map() & filter()
  • 好的,谢谢@SLaks 我是 ATM 的初学者,我会尝试你的建议。我应该删除我的主题还是我的问题对某人有用?

标签: node.js angular typescript firebase promise


【解决方案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 链接事物
猜你喜欢
  • 1970-01-01
  • 2019-01-21
  • 2016-08-13
  • 2018-05-01
  • 2017-12-20
  • 2016-11-14
  • 2017-10-24
  • 2021-08-10
  • 2020-09-25
相关资源
最近更新 更多