TS2339: Eigenschaft „Stil“ existiert nicht für Typ „Element“

Lesezeit: 4 Minuten

Hier ist der Code:

const test = Array.from(document.getElementsByClassName('mat-form-field-infix'));
test.forEach((element) => {
    element.outerHTML = '<div class="good-day-today" style="width: 0px;"></div>'; // Please note that this line works fine!
    element.style.padding = '10px';
    element.style.borderTop = '0';
});

Fehler, den ich beim Kompilieren bekomme:

FEHLER in src/app//.component.ts(101,21): Fehler TS2339: Eigenschaft „Stil“ existiert nicht für Typ „Element“. Quelle/app//.component.ts(102,21): Fehler TS2339: Eigenschaft „Stil“ existiert nicht für Typ „Element“.

Wie kann ich es reparieren?

Ich habe versucht, die zu entfernen Array.from... Teil, versucht zu verwenden for of und for inversucht as anyaber oben ist die Art und Weise, wie ich es tun muss.

  • Sie müssen es nur als HTMLElement (element: HTMLElement). Nicht sicher, warum Sie array.from brauchen.

    – Chris W.

    8. November 2019 um 20:56 Uhr


  • as any oder irgend ein anderer as oder any wäre nicht erlaubt 🙁

    – AmazingDayToday

    8. November 2019 um 20:57 Uhr

  • @ChrisW., Fehler TS2315: Typ „HTMLCollection“ ist nicht generisch.

    – AmazingDayToday

    8. November 2019 um 21:13 Uhr

  • Ah, richtig, ich habe mir nicht die Zeit genommen, irgendetwas zu überprüfen, es ist nur eine Frage der Besetzung, wie Jonas es getan hat.

    – Chris W.

    8. November 2019 um 21:20 Uhr

Benutzer-Avatar
Jonas Wilms

Sie benötigen eine Typumwandlung:

Array.from(document.getElementsByClassName('mat-form-field-infix') as HTMLCollectionOf<HTMLElement>)

Das ist, weil getElementsByClassName gibt nur zurück HTMLCollection<Element>und Element hat kein styleEigentum. Das HTMLElement jedoch setzt es um über es ist ElementCSSInlineStyle erweiterte Schnittstelle.

Beachten Sie, dass diese Typumwandlung so typsicher ist, wie jede Elementist entweder ein HTMLElement oder ein SVGElementund ich hoffe, dass Ihr SVG-Elemente habe keine klasse.

  • musste ich benutzen HTMLCollectionOf<HTMLElement> damit das funktioniert.

    – Jake Holzinger

    8. November 2019 um 21:04 Uhr

  • @JakeHolzinger völlig richtig, war damit beschäftigt, den Grund für Element und HTMLElement zu suchen …

    – Jonas Wilms

    8. November 2019 um 21:06 Uhr

Benutzer-Avatar
Bestimmte Leistung

Eine weitere Option ist die Verwendung querySelectorAll und einen Typparameter. getElementsByClassName ist nicht generisch, aber querySelectorAll is – Sie können einfach den Typ der Elemente übergeben, die ausgewählt werden, wie folgt:

const test = document.querySelectorAll<HTMLElement>('.mat-form-field-infix');

Dies erfordert kein Typ-Casting, und es erlaubt Ihnen zu verwenden forEach sofort, anstatt es zuerst in ein Array zu konvertieren. (getElementsByClassName gibt eine HTMLCollection zurück, die kein hat forEach Methode; querySelectorAll gibt a zurück NodeListdie tut haben eine forEach Methode, zumindest auf einigermaßen aktuellen Browsern. Um auch alte Browser zu unterstützen, benötigen Sie eine Polyfilloder konvertieren Sie es zuerst in ein Array.)

Wenn Sie nur ein einzelnes Element benötigen, können Sie verwenden querySelectorwas ebenfalls generisch ist:

const elm = document.querySelector<HTMLElement>('.foo')!;
elm.style.padding = '10px';

Ein weiterer Vorteil von querySelectorAll (und querySelector) gegenüber den vielen anderen Optionen ist, dass sie CSS-Selektorzeichenfolgen akzeptieren, die weitaus flexibler und präziser sein können. Zum Beispiel die Auswahlzeichenfolge

.container > input:checked

wird Kinder von auswählen <div class="container"> welche sind <input>s und werden überprüft.

Wenn Sie das äußere HTML festlegen, zerstören Sie das ursprüngliche Element, das dort war. Dein Styling funktioniert also nicht.

Sie werden das bemerken, wenn Sie es ändern, um innerHTML, Ihr Styling, festzulegen tut Arbeit.

Dies macht nicht genau dasselbe, aber ich hoffe, es weist Sie in die richtige Richtung.

const test = Array.from(document.getElementsByClassName('mat-form-field-infix'));
test.forEach((element) => {
    element.innerHTML = '<div class="good-day-today" style="width: 0px;"></div>'; // Please note that this line works fine!
    element.style.padding = '10px';
    element.style.borderTop = '0';
});

  • Das sind verschiedene Elemente

    – AmazingDayToday

    8. November 2019 um 21:48 Uhr

Ich war auch mit einem ähnlichen Problem konfrontiert, während ich es tat

document.querySelectorAll(".<className>"); 

Anstatt also die style-Eigenschaft hinzuzufügen, habe ich sie einfach umgangen, indem ich einfach eine weitere Klasse hinzugefügt habe.

Beispiel:

//css file
    .<classname> {
        display: none;
      }
    .<classname>.show {
        display: flex;
      }

//ts file
elements.forEach((ele, index) => {
const errors = something.length;
if (index < errors) {
  ele.classList.add("show");
} else {
  ele.classList.remove("show");
}

}); };

Eine Problemumgehung könnte in etwa so aussehen:

element["style"].padding = '10px';
element["style"].borderTop = '0';

Vielleicht ist es nicht die beste Lösung, aber es sollte funktionieren, ich habe es mehrmals verwendet 🙂

  • In diesem Fall heißt es: Element hat implizit einen ‘beliebigen’ Typ, weil ein Ausdruck vom Typ ‘”Stil”‘ nicht verwendet werden kann, um den Typ ‘Knoten’ zu indizieren. Die Eigenschaft „Stil“ ist für den Typ „Node“ nicht vorhanden.ts(7053) – Verwendung von eslint-plugin v 5.2.0

    – Panossa

    17. März um 17:47 Uhr


Benutzer-Avatar
Levminer

Ich glaube, ich habe eine einfachere Methode gefunden:

Erstellen Sie einfach eine index.d.ts-Datei und fügen Sie hinzu:

interface Element {
    style: CSSStyleDeclaration
}

  • In diesem Fall heißt es: Element hat implizit einen ‘beliebigen’ Typ, weil ein Ausdruck vom Typ ‘”Stil”‘ nicht verwendet werden kann, um den Typ ‘Knoten’ zu indizieren. Die Eigenschaft „Stil“ ist für den Typ „Node“ nicht vorhanden.ts(7053) – Verwendung von eslint-plugin v 5.2.0

    – Panossa

    17. März um 17:47 Uhr


Benutzer-Avatar
Mostafa Mohammadzadeh

Vielleicht könnte das helfen:

let element = <HTMLElement> document.getElementsByClassName(className)[0];

1046260cookie-checkTS2339: Eigenschaft „Stil“ existiert nicht für Typ „Element“

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy