creando classe come Iterable in angolare / typescript

voti
1

Ho creato una classe in angolare, ora quando prelevo un oggetto via abbonamento deposito, anche se restituisce un array di oggetto, ma non posso usare forEach ciclo sull'oggetto restituito.

Sì, ho usato Object.keys (utente) .forEach () {..} Si sta lavorando, ma voglio fare la stessa cosa, rendendo di classe Iterable. Come questo.

Codice di esempio:-

class user {
    ...
}
ngOnInit(){
    storeSubsc = this.store.select('users').subscribe(user => {
        this.user = user;
    });
}

login(){
    Object.keys(this.user).forEach()... --> working fine
    I want it like
    this.user.forEach() {... }
}

Grazie in anticipo...

È pubblicato 24/08/2018 alle 11:47
fonte dall'utente
In altre lingue...                            


3 risposte

voti
2

Affinché la vostra classe di essere iterabile, la classe ha bisogno di avere un metodo di Symbol.iterator:

class User implements Iterable<string> {
    // ...
    constructor(private username: string, private password: string) { }

    *[Symbol.iterator](): Iterator<string> {
        for (let key of Object.keys(this)) {
            yield key;
        }
    }
}

const u = new User('blabla', '1234');
for (let k of u) {
    console.log(k);
}

In questo caso ho usato una funzione generatore.

Risposto il 24/08/2018 a 12:16
fonte dall'utente

voti
1

È possibile utilizzare for inoperator:

class User {
  // 
}

const user = new User(/*args*/); 
for (let prop in user) {
  console.log(prop, user[prop]);
}

Inoltre, è possibile verificare se l'istanza di classe ha la propcome sua proprietà user.hasOwnProperty(prop)all'interno del for inciclo. Ad esempio, se la Userclasse estende un'altra classe di base e senza controllare hasOwnPropertyvedrete il constructorcosì:

class BaseUser {
  constructor(public x, public y) { }
}

class User extends BaseUser {
  constructor(public a, public b, public x, public y) {
    super(x, y);
  }
}

const user = new User('12', 2, 111, 222); 
for (let prop in user) {
  alert(prop);
}

Vedrete cinque avvisi: x, y, a, b, constructor.

Risposto il 24/08/2018 a 12:10
fonte dall'utente

voti
-1

Qualcosa come questo ?

class User {
  constructor(public id: number, public name: string) {}

  iterate(callBack: Function) {
    return Object.keys(this).forEach(key => callBack(this[key]));
  }

}

const user = new User(1, 'Foo Bar');
user.iterate(item => console.log(item));
Risposto il 24/08/2018 a 11:59
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more