Search code examples
javascripttypescriptes6-promiseionic3ionic-storage

Typescript returning boolean after promise resolved


I'm trying to return a boolean after a promise resolves but typescript gives an error saying

A 'get' accessor must return a value.

my code looks like.

get tokenValid(): boolean {
    // Check if current time is past access token's expiration
    this.storage.get('expires_at').then((expiresAt) => {
      return Date.now() < expiresAt;
    }).catch((err) => { return false });
}

This code is for Ionic 3 Application and the storage is Ionic Storage instance.


Solution

  • You can return a Promise that resolves to a boolean like this:

    get tokenValid(): Promise<boolean> {
      // |
      // |----- Note this additional return statement. 
      // v
      return this.storage.get('expires_at')
        .then((expiresAt) => {
          return Date.now() < expiresAt;
        })
        .catch((err) => {
          return false;
        });
    }
    

    The code in your question only has two return statements: one inside the Promise's then handler and one inside its catch handler. We added a third return statement inside the tokenValid() accessor, because the accessor needs to return something too.

    Here is a working example in the TypeScript playground:

    class StorageManager { 
    
      // stub out storage for the demo
      private storage = {
        get: (prop: string): Promise<any> => { 
          return Promise.resolve(Date.now() + 86400000);
        }
      };
    
      get tokenValid(): Promise<boolean> {
        return this.storage.get('expires_at')
          .then((expiresAt) => {
            return Date.now() < expiresAt;
          })
          .catch((err) => {
            return false;
          });
      }
    }
    
    const manager = new StorageManager();
    manager.tokenValid.then((result) => { 
      window.alert(result); // true
    });