Mithril — современный JavaScript-фреймворк для создания одностраничных приложений (SPA), который отличается минимализмом и высокой производительностью. При использовании TypeScript важно настроить проект таким образом, чтобы статическая типизация работала корректно и обеспечивала безопасное взаимодействие с компонентами и виртуальным DOM.
Для полноценной работы с Mithril и TypeScript необходимо установить следующие пакеты:
npm install mithril
npm install --save-dev typescript @types/mithril
mithril — основной пакет фреймворка.typescript — компилятор и ядро поддержки TS.@types/mithril — типы для TypeScript, обеспечивающие
автодополнение и проверку типов.Файл tsconfig.json является центральным элементом
конфигурации TypeScript. Для работы с Mithril рекомендуется использовать
следующие параметры:
{
"compilerOptions": {
"target": "ES6",
"module": "ESNext",
"moduleResolution": "Node",
"strict": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"skipLibCheck": true,
"jsx": "preserve",
"jsxFactory": "m",
"allowSyntheticDefaultImports": true,
"noImplicitAny": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"resolveJsonModule": true,
"outDir": "./dist"
},
"include": ["src/**/*"],
"exclude": ["node_modules"]
}
Ключевые моменты конфигурации:
"jsx": "preserve" и "jsxFactory": "m" —
необходимы для поддержки JSX с Mithril. m используется
вместо стандартного React.createElement."strict": true — включает все строгие проверки
TypeScript, повышая надёжность кода."skipLibCheck": true — отключает проверку типов в
сторонних библиотеках, что ускоряет компиляцию."allowSyntheticDefaultImports": true — позволяет
импортировать Mithril как import m from 'mithril'; вместо
использования import * as m.Компоненты Mithril в TypeScript могут быть определены с помощью интерфейсов или типов. Существуют два основных подхода: функциональные и классовые компоненты.
Функциональный компонент:
import m, { Component } from 'mithril';
interface ButtonAttrs {
label: string;
onClick: () => void;
}
const Button: Component<ButtonAttrs> = {
view: ({ attrs }) => m('button', { onclick: attrs.onClick }, attrs.label)
};
export default Button;
Классический компонент:
import m, { Component } from 'mithril';
interface CounterAttrs {
initial?: number;
}
interface CounterState {
count: number;
}
class Counter implements Component<CounterAttrs> {
count: number;
constructor(vnode: m.Vnode<CounterAttrs, this>) {
this.count = vnode.attrs.initial || 0;
}
view() {
return m('div', [
m('span', this.count),
m('button', { onclick: () => this.count++ }, '+')
]);
}
}
export default Counter;
Особенности типизации:
attrs задают типы свойств компонента.vnode предоставляет доступ к атрибутам и состоянию
компонента.Mithril поддерживает JSX, что позволяет писать компоненты в привычном
виде. Для корректной работы JSX нужно установить
@types/mithril и настроить "jsxFactory": "m" в
tsconfig. Пример:
import m from 'mithril';
interface AppProps {
title: string;
}
const App = ({ title }: AppProps) => (
<div>
<h1>{title}</h1>
<p>Пример использования JSX с Mithril и TypeScript</p>
</div>
);
export default App;
Важные нюансы:
render — Mithril
автоматически преобразует его в вызовы m().onclick принимает строго функцию, без возможности
передать значение undefined.Для TypeScript рекомендуется использовать ES-модули:
import m from 'mithril';
import Button from './components/Button';
Типичный способ интеграции с Node.js:
"moduleResolution": "Node" позволяет корректно
разрешать пути."esModuleInterop": true упрощает импорт по
умолчанию.TypeScript-компиляцию можно запускать через:
tsc --project tsconfig.json
Для интеграции с сборщиками (Webpack, Vite, Parcel):
ts-loader или vite-plugin-ts для
обработки .ts и .tsx файлов.jsxFactory: m."sourceMap": true.TypeScript позволяет строго типизировать состояние компонентов:
interface TimerAttrs {
interval: number;
}
interface TimerState {
seconds: number;
timerId?: number;
}
const Timer: m.Component<TimerAttrs, TimerState> = {
oninit: (vnode) => {
vnode.state.seconds = 0;
vnode.state.timerId = window.setInterval(() => {
vnode.state.seconds++;
m.redraw();
}, vnode.attrs.interval);
},
onremove: (vnode) => {
clearInterval(vnode.state.timerId);
},
view: (vnode) => m('div', `Seconds: ${vnode.state.seconds}`)
};
Преимущества:
state и
attrs.TypeScript позволяет безопасно подключать сторонние библиотеки,
включая jQuery, Lodash, или API, не имеющие собственных типов. Для этого
используется @types/.... Например:
import _ from 'lodash';
const nums: number[] = [1, 2, 3, 4];
const doubled = _.map(nums, n => n * 2);
Для Mithril это особенно важно при взаимодействии с DOM, запросами
через m.request или сложными объектами состояния.
Эта конфигурация TypeScript обеспечивает безопасную и эффективную работу с Mithril, позволяя использовать все возможности фреймворка без потери преимуществ строгой типизации и автодополнения.