Библиотека Globalize предоставляет функциональность интернационализации на основе данных Unicode CLDR. При использовании в TypeScript-проектах ключевым аспектом становится наличие корректных типов, описывающих API форматирования чисел, дат, сообщений и единиц измерения.
Типизация может быть реализована тремя основными способами:
.d.ts при нестандартной
интеграции.Выбор подхода зависит от версии библиотеки, способа сборки и конфигурации TypeScript.
Базовая установка выполняется через npm:
npm install globalize
Дополнительно почти всегда требуются CLDR-данные, без которых библиотека не выполняет форматирование:
npm install cldr-data
В современных сборках часто используется также загрузка CLDR через bundler или отдельные JSON-файлы.
Если используемая версия Globalize не содержит встроенных типов, применяется пакет типов из DefinitelyTyped:
npm install --save-dev @types/globalize
После установки TypeScript автоматически подхватывает декларации, если соблюдены стандартные правила разрешения модулей.
Структурно пакет типов описывает:
number, date,
currency);TypeScript резолвит типы по следующим правилам:
node_modules/@types/globalize;.d.ts внутри пакета
globalize;Если типы не определяются автоматически, проверяется конфигурация
tsconfig.json.
Ключевые параметры, влияющие на корректную установку типов:
{
"compilerOptions": {
"moduleResolution": "node",
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"skipLibCheck": true
}
}
node или bundler-режим определяет стратегию
поиска .d.ts файлов. Для Globalize чаще используется
классический node.
Опция снижает риск конфликтов типов между
@types/globalize и другими библиотеками
интернационализации.
Globalize поддерживает несколько вариантов импорта, и каждый влияет на типизацию.
const Globalize = require("globalize");
Типы подключаются через @types/globalize автоматически,
если пакет установлен.
import Globalize from "globalize";
или
import * as Globalize from "globalize";
Корректный вариант зависит от конфигурации
esModuleInterop. При включённой опции предпочтителен первый
вариант.
Типизация Globalize не ограничивается самим API. Существенное значение имеет структура CLDR-данных.
import Globalize from "globalize";
import likelySubtags from "cldr-data/supplemental/likelySubtags.json";
import numbers from "cldr-data/main/en/numbers.json";
Типы не описывают содержимое CLDR-файлов полностью, так как они представляют собой большие JSON-структуры. Вместо этого описываются только методы загрузки и интерфейсы работы с ними.
Типы описывают перегрузки метода:
Globalize.numberFormatter(options?: object): (value: number) => string;
Результат — функция форматирования, принимающая число и возвращающая строку.
Globalize.dateFormatter(options?: object): (value: Date) => string;
Типы учитывают:
Date;Globalize(locale).Globalize.currencyFormatter(currency: string, options?: object): (value: number) => string;
Типизация фиксирует обязательный параметр валюты и возвращаемую функцию форматирования.
В ряде случаев @types/globalize может быть неполным или
несовместимым с конкретной версией библиотеки. Тогда используется
модульное расширение.
Создаётся файл деклараций:
// globalize.d.ts
declare module "globalize" {
const Globalize: any;
export default Globalize;
}
Такой подход отключает строгую типизацию, но устраняет ошибки компиляции.
При необходимости точной типизации API создаются расширенные интерфейсы:
interface NumberFormatterOptions {
minimumFractionDigits?: number;
maximumFractionDigits?: number;
}
type NumberFormatter = (value: number) => string;
И затем происходит привязка к API Globalize через декларации:
declare module "globalize" {
interface GlobalizeStatic {
numberFormatter(options?: NumberFormatterOptions): NumberFormatter;
}
}
На практике встречаются следующие проблемы:
globalize и
@types/globalize;TypeScript использует следующий порядок:
.d.ts;node_modules/@types;any.Это влияет на поведение при конфликтующих декларациях.
Типизация считается корректной, если:
TS2307 (module not found);TS7006 (implicit any) при строгом
режиме;В сборках с Vite, Webpack или Rollup типы не влияют на runtime, но влияют на:
Globalize как модульная библиотека требует аккуратного импорта
подмодулей, что отражается в .d.ts структурах.
Типы часто логически разделяются на группы:
Это соответствует архитектуре самой библиотеки и помогает поддерживать расширяемость деклараций.
Хотя типы не описывают данные CLDR, версия CLDR влияет на:
Несоответствие версий может приводить к расхождению ожиданий типов и фактического результата выполнения.