FontAwesome 6 с Angular 18: аргумент типа IconDefinition нельзя назначить параметру типа IconName | ЗначокПоиск'

Я обновил свой проект Angular с 17 до 18, а также обновил FontAwesome до 6.6.0 и @fortawesome/angular-fontawesome до 0.15.0. Я проверил package-lock.json, и все пакеты FontAwesome используют одну и ту же версию.

Предыдущая версия FontAwesome была 6.5.2 и 0.14.1 @fortawesome/angular-fontawesome.

В соответствии с инструкциями по обновлению @fortawesome/angular-fontawesome я переместил импорт типов с @fortawesome/fontawesome-svg-core на @fortawesome/angular-fontawesome, но получаю следующую ошибку:

✘ [ERROR] TS2345: Argument of type 'IconDefinition' is not assignable to parameter of type 'IconName | IconLookup'.
  Type 'IconDefinition' is not assignable to type 'IconLookup'.
    Types of property 'prefix' are incompatible.
      Type 'import("D:/Project/Frontend/OAKKPortal/OAKKPortal/node_modules/@fortawesome/angular-fontawesome/types").IconPrefix' is not assignable to type 'import("D:/Project/Frontend/OAKKPortal/OAKKPortal/node_modules/@fortawesome/fontawesome-common-types/index").IconPrefix'.
        Type 'string & {}' is not assignable to type 'IconPrefix'. [plugin angular-compiler]

    projects/material-lib/src/lib/util/register-icons.class.ts:43:20:
      43 │     return iconFunc(icon).html.join('');
         ╵                     ~~~~


✘ [ERROR] TS2345: Argument of type 'IconDefinition' is not assignable to parameter of type 'IconName | IconLookup'. [plugin angular-compiler]

    projects/material-lib/src/lib/util/register-icons.class.ts:47:54:
      47 │ ...n sanitizer.bypassSecurityTrustHtml(iconFunc(icon).html.join(''));
         ╵                                                 ~~~~

Соответствующий код, который не удается скомпилировать:

import { MatIconRegistry } from '@angular/material/icon';
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
import {
  FaIconLibrary,
  IconDefinition,
  IconName,
  IconPrefix,
} from '@fortawesome/angular-fontawesome';
import { icon as iconFunc } from '@fortawesome/fontawesome-svg-core';

export class RegisterFontIcons {
  public static registerMaterialIcons(iconRegistry: MatIconRegistry) {
    // Register the material icon styles
    iconRegistry.registerFontClassAlias(
      'outlined',
      'mat-ligature-font material-icons material-icons-outlined',
    );
  }

  public static registerFontAwesomIcons(iconRegistry: MatIconRegistry) {
    // Set default font set to Font Awesome Solid icons for non-SVG icons
    iconRegistry.setDefaultFontSetClass('fa-solid');
  }

  public static registerFontAwesomSvgIcons(
    iconRegistry: MatIconRegistry,
    sanitizer: DomSanitizer,
    icons: IconDefinition[],
  ) {
    icons.forEach((icon: IconDefinition) => {
      // console.info(icon.prefix, icon.iconName);
      const svg: SafeHtml = RegisterFontIcons.getLiteralSafeSvg(sanitizer, icon);
      if (icon.prefix === 'fas') {
        iconRegistry.addSvgIconLiteral(icon.iconName, svg);
      } else {
        // Only use a namespace for the non-solid icons
        iconRegistry.addSvgIconLiteralInNamespace(icon.prefix, icon.iconName, svg);
      }
    });
  }

  public static getLiteralSvg(icon: IconDefinition): string {
    return iconFunc(icon).html.join('');
  }

  public static getLiteralSafeSvg(sanitizer: DomSanitizer, icon: IconDefinition): SafeHtml {
    return sanitizer.bypassSecurityTrustHtml(iconFunc(icon).html.join(''));
  }

  public static getFontAwesomeIcon(
    faIconLibrary: FaIconLibrary,
    prefix: IconPrefix,
    name: IconName,
  ): IconDefinition {
    return faIconLibrary.getIconDefinition(prefix, name);
  }
}

Функции, которые не работают, — это getLiteralSvg и getLiteralSafeSvg.

Глядя на определение IconLookup, следующее изменение также не работает:

public static getLiteralSvg(icon: IconDefinition): string {
  return iconFunc({ iconName: icon.iconName, prefix: icon.prefix }).html.join('');
}

Выдает следующую ошибку:

✘ [ERROR] TS2322: Type 'import("D:/Project/Frontend/OAKKPortal/OAKKPortal/node_modules/@fortawesome/angular-fontawesome/types").IconName' is not assignable to type 'import("D:/Project/Frontend/OAKKPortal/OAKKPortal/node_modules/@fortawesome/fontawesome-common-types/index").IconName'.
  Type 'string & {}' is not assignable to type 'IconName'. [plugin angular-compiler]

    projects/material-lib/src/lib/util/register-icons.class.ts:43:22:
      43 │     return iconFunc({ iconName: icon.iconName, prefix: icon.prefix...
         ╵                       ~~~~~~~~


✘ [ERROR] TS2322: Type 'import("D:/Project/Frontend/OAKKPortal/OAKKPortal/node_modules/@fortawesome/angular-fontawesome/types").IconPrefix' is not assignable to type 'import("D:/Project/Frontend/OAKKPortal/OAKKPortal/node_modules/@fortawesome/fontawesome-common-types/index").IconPrefix'.
  Type 'string & {}' is not assignable to type 'IconPrefix'. [plugin angular-compiler]

    projects/material-lib/src/lib/util/register-icons.class.ts:43:47:
      43 │ ...c({ iconName: icon.iconName, prefix: icon.prefix }).html.join('');
         ╵                                 ~~~~~~

Есть идеи, как это решить?

Используя @fortawesome/fontawesome-svg-core напрямую, вы можете продолжать импортировать типы из @fortawesome/fontawesome-svg-core. Я подумаю, как сделать инструкции по обновлению более понятными в этом отношении.

Yaroslav Admin 22.07.2024 10:19
Тестирование функциональных 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
1
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Ошибка, которую вы получаете из-за конфликта типов в разных библиотеках, типы, которые ожидает iconFunc, взяты из библиотеки @fortawesome/fontawesome-common-types, но не из @fortawesome/angular-fontawesome.

Быстрым решением будет дифференцировать типы с разными именами:

import {
  IconDefinition as CommonIconDefinition,
  IconName as CommonIconName,
  IconPrefix as CommonIconPrefix,
} from '@fortawesome/fontawesome-common-types';

  public static getLiteralSvg(icon: IconDefinition): string {
    return iconFunc({
      iconName: icon.iconName as CommonIconName,
      prefix: icon.prefix as CommonIconPrefix,
    }).html.join('');
  }

  public static getLiteralSafeSvg(
    sanitizer: DomSanitizer,
    icon: IconDefinition
  ): SafeHtml {
    return sanitizer.bypassSecurityTrustHtml(
      iconFunc({
        iconName: icon.iconName as CommonIconName,
        prefix: icon.prefix as CommonIconPrefix,
      }).html.join('')
    );
  }

Другой подход заключается в том, что, обращаясь к @fortawesome/fontawesome-svg-core, как это сделал angular-fontawesome, вам просто нужно внести изменения в свой getFontAwesomeIcon метод.

import { icon as iconFunc, 
  IconPrefix,
  IconName,
  IconDefinition
} from '@fortawesome/fontawesome-svg-core';

public static getFontAwesomeIcon(
    faIconLibrary: FaIconLibrary,
    prefix: IconPrefix,
    name: IconName
  ): IconDefinition | null {
    return faIconLibrary.getIconDefinition(prefix, name) as IconDefinition;
  }

Использовал первый подход и он работает. Нужно было добавить значки как FaIconLibrary (из @fortawesome/angular-fontawesome, уже готово), так и library (из @fortawesome/fontawesome-svg-core). В противном случае функция icon не будет работать.

Kees de Bruin 22.07.2024 14:59

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