Современные версии CesiumJS распространяются с встроенными
TypeScript-типами, что исключает необходимость установки внешних пакетов
@types/cesium. Типы поставляются вместе с библиотекой и
синхронизированы с исходным API, что снижает риск рассинхронизации между
реализацией и декларациями.
Типизация охватывает ключевые подсистемы:
Viewer и его конфигурацииScene, Camera, GlobeEntity и их свойстваPrimitive,
GeometryInstance)GeoJsonDataSource,
KmlDataSource)Cartesian3, Matrix4,
Quaternion)Типы расположены в пакете cesium и экспортируются
напрямую через ESM-границы.
Использование CesiumJS в TypeScript-проекте предполагает корректную настройку компилятора и сборщика модулей.
npm install cesium
Ключевым моментом является поддержка современных модулей и разрешение
типов из node_modules.
{
"compilerOptions": {
"target": "ES2020",
"module": "ESNext",
"moduleResolution": "Bundler",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"types": ["cesium"]
}
}
Особенности конфигурации:
skipLibCheck снижает вероятность конфликтов между
сложными геометрическими типамиmoduleResolution: "Bundler" необходим при использовании
Vite, Webpack 5 или esbuildstrict) особенно важен для работы с
геометрией и координатамиCesium использует модульную структуру ES, поэтому импорт осуществляется напрямую:
import {
Viewer,
Cartesian3,
Color,
Entity
} from "cesium";
При использовании сборщиков требуется учитывать ресурсы Cesium (Workers, Assets, Widgets), которые не входят в стандартный бандл и должны быть отдельно настроены.
Viewer является центральной точкой управления сценой и
типизирован как класс с обширным набором опций:
const viewer: Viewer = new Viewer("cesiumContainer", {
terrainProvider: undefined,
animation: false,
timeline: false
});
Основные типизированные поля:
scene: Scenecamera: Cameraentities: EntityCollectionEntity API полностью типизирована и использует декларативную модель описания объектов.
const entity: Entity = viewer.entities.add({
position: Cartesian3.fromDegrees(30.5, 50.4, 1000),
point: {
pixelSize: 10,
color: Color.RED
}
});
Типизация обеспечивает:
billboard,
label, path)CesiumJS активно использует строгие математические типы для 3D-вычислений.
const position: Cartesian3 = Cartesian3.fromDegrees(55.75, 37.61, 500);
Тип гарантирует корректное использование 3D-векторов в сцене.
import { Matrix4 } from "cesium";
const transform: Matrix4 = Matrix4.IDENTITY;
Используется для преобразований объектов в мировом пространстве.
import { GeoJsonDataSource } from "cesium";
const dataSource: GeoJsonDataSource = await GeoJsonDataSource.load(
"/data/map.geojson"
);
viewer.dataSources.add(dataSource);
Типизация обеспечивает:
Cesium требует настройки статических ресурсов:
import { defineConfig } from "vite";
import cesium from "vite-plugin-cesium";
export default defineConfig({
plugins: [cesium()]
});
Типы при этом не требуют дополнительных конфигураций — они подтягиваются из пакета автоматически.
const CopyWebpackPlugin = require("copy-webpack-plugin");
const cesiumSource = "node_modules/cesium/Source";
module.exports = {
resolve: {
alias: {
cesium: cesiumSource
}
},
plugins: [
new CopyWebpackPlugin({
patterns: [
{ from: `${cesiumSource}/Workers`, to: "Workers" },
{ from: `${cesiumSource}/Assets`, to: "Assets" },
{ from: `${cesiumSource}/Widgets`, to: "Widgets" }
]
})
]
};
TypeScript при этом продолжает работать поверх обычного JavaScript-бандла без изменений.
Cesium предоставляет событийную систему с типизированными callback-функциями.
viewer.camera.changed.addEventListener(() => {
const position = viewer.camera.position;
});
Типы событий:
Event — базовый класс событийной системыПри расширении Entity можно использовать интерфейсы TypeScript для описания доменных моделей:
interface CustomEntityProps {
id: string;
altitude: number;
}
const customEntity = viewer.entities.add({
position: Cartesian3.fromDegrees(10, 10),
properties: {
id: "A1",
altitude: 1200
}
});
Cesium сохраняет свойства в PropertyBag, который также
типизирован.
import { JulianDate } from "cesium";
const time: JulianDate = JulianDate.now();
JulianDate используется для:
На практике встречаются следующие ситуации:
Cesium чувствителен к строгой типизации, поэтому предпочтительны версии TS >= 4.5.
Некоторые классы пересекаются с WebGL и DOM API, что требует
аккуратной настройки lib:
{
"compilerOptions": {
"lib": ["ES2020", "DOM"]
}
}
Cesium предоставляет доступ к WebGL через обёртки:
ContextShaderProgramDrawCommandimport { DrawCommand } from "cesium";
const command: DrawCommand = new DrawCommand({
// параметры отрисовки
});
Эти структуры строго типизированы, поскольку ошибки в них приводят к сбоям GPU-пайплайна.
CesiumJS поддерживает ESM-импорты, что позволяет TypeScript-сборщикам выполнять tree-shaking:
При создании расширений часто требуется расширять глобальные типы Cesium:
declare module "cesium" {
interface Entity {
customField?: string;
}
}
Такой подход интегрирует пользовательскую модель данных в стандартную типизацию API без потери совместимости с обновлениями библиотеки.