TS - Аргумент типа "(x: HTMLElement) => void" не может быть назначен параметру

Здравствуйте и заранее спасибо за любую помощь!

Работал с моей первой страницей Angular и работал над учебным пособием, чтобы все мои мат-карты были одинаковой высоты динамически для изменения размера. Возникновение ошибки на моем forEach((x: HTMLElement) => ... См. код ниже.

TS:
import { Directive, ElementRef, AfterViewChecked, Input, HostListener } from '@angular/core';

@Directive({
  selector: '[myMatchHeight]'
})

export class MatchHeightDirective implements AfterViewChecked {
  // Class name to match height
  @Input()
  myMatchHeight: any;

  constructor(private el: ElementRef) {

  }

  ngAfterViewChecked() {
    // Call our matchHeight function here
    this.matchHeight(this.el.nativeElement, this.myMatchHeight);
  }

  @HostListener('window:resize')
  onResize() {
    // Call our matchHeight function
    this.matchHeight(this.el.nativeElement, this.myMatchHeight);
  }

  matchHeight(parent: HTMLElement, className: string) {
    // Match height logic here
    if (!parent) return;

    const children = parent.getElementsByClassName(className);

    if (!children) return;

    // Reset children height
    Array.from(children).forEach((x: HTMLElement) => {
      x.style.height = 'auto';
    });

    // Get all child el heights
    const itemHeights = Array.from(children).map(x => x.getBoundingClientRect().height);


    // Find max height
    const maxHeight = itemHeights.reduce((prev, curr) => {
      return curr > prev ? curr : prev;
    }, 0);

    // Apply max height
    Array.from(children).forEach((x: HTMLElement) => {
      x.style.height = `${maxHeight}px`;
    });
  }
}

HTML:
<div class = "cards-container">
        <div myMatchHeight = "mat-card" fxLayout = "row wrap" fxLayoutGap = "16px grid" fxLayoutAlign = "center stretch">
          <div fxFlex = "500px" fxFlex.xs = "85%" fxFlex.md = "40%">
            <mat-card fxLayout = "column" fxLayoutAlign = "space-between center">
              <mat-card-header>
                <mat-card-title>First M. Last</mat-card-title>
              </mat-card-header>

              <div class = "image-container" fxLayoutAlign = "center">
                <img src = "../../assets/images/image1.jpg" />
              </div>

              <mat-card-content>
                <p>
                  I'm baby seitan tilde vape, farm-to-table in enamel pin forage reprehenderit. Retro sunt VHS
                  fingerstache, cray aliquip activated charcoal you probably haven't heard of them actually brooklyn
                  banjo labore vinyl four loko. Velit poke cupidatat pour-over nisi adipisicing master cleanse sriracha
                  lo-fi prism. Austin adipisicing duis mlkshk, occaecat hot chicken wayfarers disrupt pabst dolore
                  cold-pressed next level trust fund snackwave.
                </p>
              </mat-card-content>
            </mat-card>
          </div>

          <div fxFlex = "500px" fxFlex.xs = "85%" fxFlex.md = "40%">
            <mat-card fxLayout = "column" fxLayoutAlign = "space-between center">
              <mat-card-header>
                <mat-card-title>First M. Last</mat-card-title>
              </mat-card-header>

              <div class = "image-container" fxLayoutAlign = "center">
                <img src = "../../assets/images/image2.jpg" />
              </div>

              <mat-card-content>
                <p>
                  Hammock scenester veniam eiusmod truffaut mixtape, raw denim aesthetic. Mlkshk franzen cornhole
                  flannel. Letterpress bitters deserunt ut in ad dolor tumeric. Prism meggings brooklyn chillwave,
                  mixtape readymade salvia enamel pin fam fingerstache voluptate in man braid.
                </p>
              </mat-card-content>
            </mat-card>
          </div>
        </div>
      </div>


Error:
error TS2345: Argument of type '(x: HTMLElement) => void' is not assignable to parameter of type '(value: Element, index: number, array: Element[]) => void'.
      Types of parameters 'x' and 'value' are incompatible.
        Type 'Element' is not assignable to type 'HTMLElement'.

      Array.from(children).forEach((x: HTMLElement) => {

Пожалуйста, дайте мне знать, если потребуется дополнительная информация. Еще раз спасибо за любую поддержку!

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
2
0
993
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

document.getElementsByClassName возвращает HTMLCollection объектов Element.

Вы пытались использовать Element как тип вместо HTMLElement?

Array.from(children).forEach((x: Element) => { 
   if (x instanceof HTMLElement) {
     x.style.height = 'auto';
   }
});

Альтернативой может быть использование querySelector:

const children = parent.querySelector(`.${className}`) as HTMLElement;

if (!children) return;

Array.from(children).forEach((x: HTMLElement) => {
  x.style.height = 'auto';
});

На самом деле я пробовал это раньше, но тогда не был уверен, как получить высоту, поскольку «.style» не является свойством Element.

Villux-NV 11.12.2020 00:55

Вы должны иметь возможность преобразовать его в HTMLElement. Я обновил свой ответ.

maidi 11.12.2020 01:30

Кажется, я все еще получаю сообщение об ошибке. Я не использовал TS или Angular долго, поэтому не уверен, что на моей стороне что-то не так. Но когда я пытаюсь его обслужить, я все еще вижу, что «стиль» не существует для типа «Элемент».

Villux-NV 11.12.2020 02:58

Я снова отредактировал свой ответ с двумя новыми альтернативами. Вы можете убедиться внутри forEach, что x является экземпляром HTML-элемента.

maidi 11.12.2020 11:15

Да! Instanceof решил мою проблему. Я должен буду изучить это больше, так как я не использовал его много. Большое спасибо за помощь!

Villux-NV 11.12.2020 15:57

Другие вопросы по теме