У меня есть стандартная веб-страница (не приложение, отображаемое с помощью angular, реагировать, vue и т. Д.), Использующее jQuery и другие библиотеки.
Я хочу интегрировать передовой опыт с TypeScript.Каков наилучший способ сделать это?
Моя текущая идея состоит в том, чтобы иметь 3 файла:
- index.d.ts (описывает типы моего модуля)
- test.ts (реализация типов, описанных в index.d.ts)
- page.js (файл, который использует JavaScript, определенный в test.js - вывод из test.ts)
В настоящее время у меня есть это содержимое:
index.d.ts
// Type definitions for test 1.0.0
// Project: Test
// Definitions by: Author Name
/// <reference path="../../lib/@types/jquery/index.d.ts" />
declare namespace TestNS {
export class TestClass {
// Fields
element: JQuery;
value: string;
constructor(element: JQuery, val: string);
OnCreate();
static AttachToJQuery(jq: JQueryStatic): void;
}
interface JQuery {
TestClass(element: JQuery, val?: string): TestNS.TestClass;
}
interface JQueryStatic {
TestClass(element: JQuery, val?: string): TestNS.TestClass;
}
}
Test.ts (загружено 2-е, послеjQuery)
/// <reference path="../../lib/@types/jquery/index.d.ts" />
/// <reference path="./index.d.ts" />
export namespace TestNS {
export class TestClass {
// Fields
element: JQuery;
value: string;
constructor(element: JQuery, val: string) {
this.element = element;
this.value = val;
this.OnCreate();
}
OnCreate() {
this.element.data('test-value', this.value);
}
static AttachToJQuery(jq: JQueryStatic) {
//no jQuery around
if (!jq) {
return false;
}
jq.fn.extend({
TestNS: function(newVal) {
return this.each(function() {
var obj = jq(this);
new TestNS.TestClass(obj, newVal);
});
}
});
}//attach to jquery method (to easily work with noconflict mode)
}//test class
}
page.js (загружен последним)
let newJquery:JQueryStatic = jQuery.noConflict();
TestNS.TestClass.AttachToJQuery(newJquery);
let testElems = newJquery(".testClass");
testElems.TestClass();
Моя цель - аккуратно организовать мой код в пространстве имен в машинописи.как на странице (но это делает в машинописном тексте ошибки, связанные с дублирующимися идентификаторами), а также является модульным и расширяемым.Я понимаю, что я должен публиковать свои типы в каталоге "node_modules / @ types", но я просто хочу, чтобы они все сейчас инкапсулированы в этом модуле.
Я попытался использовать модуль и импортировать то, что определено в index.d.ts, но TypeScript говорит, что я не могу импортировать этот файл, и что имя модуля не может быть найдено.Я узнал, что если я использую модуль, он должен сопровождаться загрузчиком, таким как CommonJS, RequireJS или AMD, но я бы предпочел пока избегать этого (если это не ужасная практика, так как я хочуминимизировать уровни сложности на данный момент).
Я пробовал смотреть на другие проекты, но все они используют загрузчик, который кажется немного излишним для этого вида сценария.
Есть лихороший способ пойти по этому поводу?