0Pricing
TypeScript Academy · レッスン

型のないサードパーティライブラリへの対応

@typesパッケージを使い、手動で宣言を記述します。

「型のないサードパーティライブラリへの対応」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これは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の場合、型のないモジュールをインポートするとコンパイルエラーになります。宣言ファイルを使うか、// @ts-ignoreによってファイル単位でnoImplicitAnyを無効にします。

// 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時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全4レッスンが含まれています。

「型のないサードパーティライブラリへの対応」で何を学びますか?

@typesパッケージを使い、手動で宣言を記述します。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

TypeScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「型のないサードパーティライブラリへの対応」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このTypeScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 移行の開始:allowJsとcheckJs
  2. 橋渡しとしてのJSDoc型注釈
  3. ファイル単位の変換戦略
  4. 型のないサードパーティライブラリへの対応
← TypeScript Academyに戻る