Имеет ли смысл файл типизации без каких-либо объявленных модулей?

Я пытаюсь понять, как использовать файлы типизации в моем проекте Angular. Но все руководства или сообщения SO, кажется, говорят просто импортировать объявленный модуль в файл типов. В моем случае (gridstack.js) у него нет объявленных модулей, только интерфейсы и одно объявленное пространство имен.

Я объявил gridstack в файле tsconfig.file под типами. И я могу, например. объявить переменную типа IGridstackOptions без ошибок компиляции, но я получаю сообщение об ошибке времени выполнения, говорящее мне C:/myPath/src/app/other-route/other-route.component.ts (16,60): Cannot find name 'IGridstackOptions'.

Кто-нибудь знает, что я делаю неправильно? И есть ли смысл иметь файл типизации без объявленных модулей? Если да, можете ли вы объяснить причину этого?

Спасибо :)


person Beese    schedule 17.10.2017    source источник


Ответы (1)


Вы можете использовать библиотеку в JavaScript двумя способами:

  • используя глобальный объект библиотеки
  • импорт объекта библиотеки

До недавнего времени большинство библиотек преимущественно использовали первый подход и добавляли глобальные объекты. Например, глобальный объект jQuery. В настоящее время большинство библиотек упаковывают свои библиотеки в виде модулей UMD, что позволяет использовать библиотеку как глобальный объект или как импорт, если код выполняется в среде, поддерживающей модуль.

Typescript определяет два способа, которые можно использовать для определения объявлений:

declare namespace NodeJS
declare module "buffer"

Первый определяет объект (пространство имен, обычно глобальное), а второй определяет модуль. См. здесь.

Файл типизации для библиотеки gridstack определяет глобальный объект:

declare namespace GridStackUI

и это также то, что делается внутри кода:

(function($, _) {

    var scope = window;
    ...

    return scope.GridStackUI;
});

И это можно использовать в вашем коде следующим образом:

declare const gridstack: GridStack;

Однако внутри gridstack.js есть также определение модуля UMD, поэтому его можно использовать в среде поддержки модуля, например:

import * as gridstack from 'gridstack';

Но в файле типизации нет объявлений для этого использования.

person Max Koretskyi    schedule 18.10.2017
comment
Хорошее объяснение @AngularInDepth! Однако компилятор сообщает мне, что GridstackUI не существует в окне типа. И разве не осуждается с точки зрения дизайна использование окна в angular, но, возможно, это единственный способ сделать это? - person Beese; 18.10.2017
comment
используйте следующее declare const gridstack: GridStack;, я обновил свой ответ - person Max Koretskyi; 18.10.2017
comment
Замечательно! Как раз то, что мне было нужно, большое спасибо, ваш ответ очень ценен :) - person Beese; 18.10.2017
comment
@Beese, рад, что смог помочь :) Удачи - person Max Koretskyi; 18.10.2017