angular - hur man hanterar Typescript-fel Object.ts (7053) i nyare version av Typescript?
Jag har en kodfunktion som fungerar bra i ett av mina tidigare projekt, när jag försökte kopiera den till ett annat projekt började den ge mig följande fel. Jag har ingen aning om vad detta betyder. Kan någon föreslå vilken ändring som krävs för att få det att fungera
mitt första gissning är TS-version eller tslint.
Element har implicit typen 'any' eftersom ett uttryck av typen 'string' inte kan användas för att indexera typen 'Object'. Ingen indexsignatur med en parameter av typen 'string' hittades på typen 'Object'.ts(7053)
private convertDates(object: Object) {
if (!object || !(object instanceof Object)) {
return;
}
if (object instanceof Array) {
for (const item of object) {
this.convertDates(item);
}
}
var dateRegex = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)$/; ///^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d(\.\d+)?(([+-]\d\d:\d\d)|Z)?$/;
for (const key of Object.keys(object)) {
const value = object[key];
if (value instanceof Array) {
for (const item of value) {
this.convertDates(item);
}
}
if (value instanceof Object) {
this.convertDates(value);
}
if (typeof value === 'string' && dateRegex.test(value)) {
object[key] = new Date(value);
}
}
}
Svar #1
Problemet är att Object.keys(object) returnerar string[] och inte (keyof typeof object)[]. Och TS kan inte vara säker på att vilken string som helst kan användas för att indexera object (till exempel fungerar inte object['thisdoesnotexist']).
För anledningen till varför detta förväntas vara TS-beteende, läs detta svar
För att fixa det, använd antingen Object.entries() för att få både nyckeln och värdet samtidigt eller caste key till keyof typeof object så här:
const value = object[key as keyof typeof object];
Detta talar uttryckligen om för TS-kompilatorn att du kan använda key för att indexera object.
Svar #2
Du får detta fel eftersom Typescript blir mer strikt med nyare versioner.
När det gäller Typescript-dokumentationen själva, bör du inte använda Object för att typa ett objekt:
Använd aldrig typerna Number, String, Boolean, Symbol eller Object. Dessa typer hänvisar till icke-primitiva inbakade objekt som nästan aldrig används korrekt i JavaScript-kod.
Typescript rekommenderar att använda typen object istället men du skulle få samma fel i konsolen.
Så, antingen skapar du ett lämpligt gränssnitt som typ för ditt objekt eller så kan du använda typen Record<Keys, Type> (mer här)
Konstruerar en objekttyp vars egenskapsnycklar är Keys och vars egenskapsvärden är Type. Detta verktyg kan användas för att mappa egenskaperna hos en typ till en annan typ.
Din funktion skulle se ut så här:
private convertDates(object: Record<string, any>) {
...
}
Jag vet, any anses också vara en dålig praxis, så använd lämplig typning ;)
