0Pricing
TypeScript Academy · Урок

Работа с нетипизированными сторонними библиотеками

Используйте пакеты @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 types

skipLibCheck для ошибок в объявлениях

Если сторонний файл .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 — локальная установка не требуется.

Все уроки этого курса

  1. Начало миграции: allowJs и checkJs
  2. Аннотации типов JSDoc как переходный этап
  3. Стратегия преобразования файл за файлом
  4. Работа с нетипизированными сторонними библиотеками
← Назад к TypeScript Academy