Импортировать внешнюю библиотеку javascript, которая не указана в @types

Я пытаюсь использовать эта библиотека javascript в своем проекте angular, но мне не удалось его успешно импортировать.


Главный файл библиотеки — dist/index.js, и у него есть одно определение конструктора:

window.ConfettiGenerator = function(params) {
//....
}

Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь импортировать эту библиотеку и использовать ее в своем компоненте, у меня возникает следующая ошибка:

ERROR TypeError: confetti_js__WEBPACK_IMPORTED_MODULE_1__.ConfettiGenerator is not a constructor


Вот как я использую библиотеку:

import * as confettijs from "confetti-js";

//...

  ngOnInit() {
    let confettiSettings = {/* ... */};
    let confetti = new confettijs.ConfettiGenerator(confettiSettings);
    confetti.render();
  }

Поскольку эта библиотека не является частью пакета @типы, я объявляю ее в src/typings.d.ts, но не могу ее использовать:

declare module 'confetti-js';

Спасибо за помощь

Он говорит, что это не конструктор, поэтому не используйте new.

Heretic Monkey 08.04.2019 00:03

Я пробовал это, но в итоге получил ошибку, что это не функция.

Strider 08.04.2019 00:09

Почему бы просто не использовать let confetti = window.ConfettiGenerator(confettiSettings);?

Heretic Monkey 08.04.2019 00:10

Я только что попробовал, но у меня была эта ошибка: TypeError: cv.getContext is not a function

Strider 08.04.2019 00:13

Итак, я зашел на страницу, на которую вы ссылаетесь, и на ней есть инструкции, как это сделать. Вы пробовали просто следовать им?

Heretic Monkey 08.04.2019 00:16

Да, конечно, я пытался с помощью простого импорта import "confetti-js";, а затем вызывал функцию с помощью new ConfettiGenerator(confettiSettings);, но у меня была неизвестная ошибка конструктора

Strider 08.04.2019 00:30

Оказывается, ошибка TypeError: cv.getContext is not a function связана с плохой конфигурацией, которую я не заметил. Как вы предложили, я использовал new (<any> window).ConfettiGenerator(confettiSettings);, и он работал нормально (я добавил приведение к any, чтобы избежать ошибок компиляции). Вы можете добавить это как ответ, чтобы я мог принять его.

Strider 08.04.2019 02:03
Тестирование функциональных 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
0
7
406
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Библиотека экспортируется через глобальную переменную, поэтому вы не можете импортировать, как положено. Попробуйте следующее

  • добавить библиотеку в массив скриптов в angular.json

    "scripts": [
              "node_modules/confetti-js/dist/index.min.js"
            ]
    
  • компонент

    import { Component } from '@angular/core';
    declare var ConfettiGenerator: any;
    @Component({
      selector: 'my-app',
      templateUrl: './app.component.html',
      styleUrls: [ './app.component.css' ]
    })
    export class AppComponent  {
      name = 'Angular';
    
      ngOnInit(){
        var confettiSettings = { target: 'my-canvas' };
        var confetti = new ConfettiGenerator(confettiSettings);
        confetti.render();
      }
    }
    

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