node.js - 'this' are implicit tipul 'any' deoarece nu are o adnotare de tip.ts(2683)


userSchema.pre('save', async function(done) {
    if (this.isModified('pass')) {
        const hashed = await Password.toHash(this.get('pass'));
        this.set('pass', hashed);
    }
    done();
});

Primesc următoarea eroare de la „asta”:

'this' are implicit tipul 'any' deoarece nu are o adnotare de tip.ts(2683)

Am auzit că problema provine de la tasta săgeată, dar nu folosesc o tastă săgeată pentru funcția de callback? Încă primesc o eroare. Ce se întâmplă?

De asemenea, primesc o eroare de la „done”:

Parametrul 'done' are implicit tipul 'any'.ts(7006)

Ar putea fi un fel de eroare cu Visual Studio Code?

Răspuns #1

Nu este o eroare în VS Code sau în TypeScript. Este pur și simplu că nu există suficiente informații din apel pentru ca TypeScript să determine la ce va fi legat this când funcția va fi executată în cele din urmă de Mongoose.

Presupunând că aveți un tip numit User, puteți remedia acest lucru cu o adnotare de tip this explicită.

userSchema.pre('save', async function(this: User, done) {
    if (this.isModified('pass')) {
        const hashed = await Password.toHash(this.get('pass'));
        this.set('pass', hashed);
    }
    done();
});

Rețineți că sintaxa folosită pentru a specifica tipul lui this este o sintaxă specială în sensul că nu generează un parametru în JavaScript-ul rezultat:

function(this: X) {}

se compilează în

function() {}

Răspunsul #2

Ai încercat să faci următoarele, am avut aceeași problemă și am găsit o soluție astfel...

// We generally explicitly provide a type to the arguments we are using...

userSchema.pre('save', async function(done: any) {
    const self: any = this;

    if (this.isModified('pass')) {
        const hashed = await Password.toHash(self.get('pass'));
        self.set('pass', hashed);
    }
    done();
});

Din ceea ce am ajuns să înțeleg, eroarea provine din configurația TypeScript care poate fi modificată pentru tipările implicite pentru a nu afișa eroarea.