Работа с нетипизированными сторонними библиотеками
Используйте пакеты @types и пишите объявления вручную
«Работа с нетипизированными сторонними библиотеками» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.
Проблема: отсутствующие типы
Некоторые пакеты npm не поставляются с объявлениями TypeScript и не имеют пакета @types/. По умолчанию TypeScript рассматривает их как any, из-за чего на границе теряется безопасность типов.
import legacyLib from "untyped-lib"; // legacyLib: anyПакеты @types
Проект DefinitelyTyped предоставляет поддерживаемые сообществом объявления типов для тысяч библиотек. Выполните поиск в npm по запросу @types/library-name.
npm install --save-dev @types/lodash
npm install --save-dev @types/express
# Now lodash and express have full TypeScript typesСоздание файла объявлений (.d.ts)
Если пакета @types не существует, создайте в проекте минимальный файл объявлений, описывающий модуль и его типы.
// src/types/untyped-lib.d.ts
declare module "untyped-lib" {
export function doSomething(x: string): number;
export const version: string;
}Расширение модуля
Расширяйте существующие типы сторонних библиотек, добавляя собственные объявления в существующий модуль, не создавая его отдельную версию.
// Extend Express Request with a custom property
declare namespace Express {
interface Request {
user?: AuthUser;
}
}Объявления модулей с подстановочными знаками
Для целых категорий импортов без типизации, например файлов ресурсов, используйте объявления модулей с подстановочными знаками.
// src/types/assets.d.ts
declare module "*.svg" {
const content: string;
export default content;
}
declare module "*.json" {
const value: Record<string, unknown>;
export default value;
}noImplicitAny и библиотеки без типизации
При значении noImplicitAny: true импорт модуля без типизации вызывает ошибку компиляции. Используйте файл объявлений или отключите noImplicitAny для отдельного файла с помощью // @ts-ignore.
// Quick fix for a single untyped import:
// @ts-ignore
import untypedLib from "untyped-lib";Участие в DefinitelyTyped
Если вы создаёте качественные типы для библиотеки без типизации, отправьте их в DefinitelyTyped, чтобы помочь сообществу.
# Fork DefinitelyTyped and add:
# types/your-library/index.d.ts
# types/your-library/package.json
# Submit a PR at github.com/DefinitelyTyped/DefinitelyTypedИспользование any в крайнем случае
Если быстро получить типы невозможно, используйте явный any и добавьте комментарий для отслеживания технического долга. Это лучше неявного any, поскольку такое решение намеренно и заметно.
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const lib: any = require("untyped-lib"); // TODO: add typesskipLibCheck для ошибок в объявлениях
Если сторонний файл .d.ts содержит внутренние ошибки, параметр skipLibCheck: true подавит их, не влияя на проверку ваших собственных типов.
{
"compilerOptions": {
"skipLibCheck": true
}
}Типизированные обёртки для небезопасных библиотек
Создайте типизированный модуль-обёртку вокруг библиотеки без типизации, чтобы изолировать any и предоставить остальному коду безопасный типизированный API.
// src/lib/safe-legacy.ts
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const raw: any = require("untyped-lib");
export function doSomething(x: string): number { return raw.doSomething(x); }Итоги: библиотеки без типизации
Работая с библиотеками без типизации, сначала проверьте наличие пакетов @types/, создавайте минимальные файлы объявлений, используйте расширение модулей, создавайте типизированные обёртки и применяйте skipLibCheck для ошибок объявлений в зависимостях.
Быстрая проверка
Где в первую очередь следует искать объявления типов для пакета npm без типизации?
Что вы узнали
Библиотеки без типизации: проверяйте пакеты @types/, создавайте файлы объявлений, расширяйте существующие типы, используйте объявления модулей с подстановочными знаками, оборачивайте небезопасные библиотеки в типизированные фасады и применяйте skipLibCheck для ошибок зависимостей.
Часто задаваемые вопросы
Урок «Работа с нетипизированными сторонними библиотеками» бесплатный?
Да — полный текст урока «Работа с нетипизированными сторонними библиотеками» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.
Чему я научусь в уроке «Работа с нетипизированными сторонними библиотеками»?
Используйте пакеты @types и пишите объявления вручную Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать TypeScript Academy?
Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Работа с нетипизированными сторонними библиотеками»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке TypeScript Academy?
Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Начало миграции: allowJs и checkJs
- Аннотации типов JSDoc как переходный этап
- Стратегия преобразования файл за файлом
- Работа с нетипизированными сторонними библиотеками