React プロジェクトにおける TypeScript の使用の概要

React プロジェクトにおける TypeScript の使用の概要

序文

この記事では、TS の基本的な概念ではなく、プロジェクトで TypeScript (以下、TS と呼びます) を React と組み合わせて使用​​することに焦点を当てます。 TS の型チェックには、オンライン TS ツール 👉TypeScript Playground を使用できます。

React要素関連

React 要素関連の型には、主にReactNodeReactElementJSX.Elementなどがあります。

  • ReactNode 。あらゆるタイプの React ノードを表します。これは、多くの状況をカバーするユニオン タイプです。
  • ReactElement/JSX 。パフォーマンスの観点から見ると、これら 2 つは一貫しており、 ReactNodeのサブセットに属し、「ネイティブ DOM コンポーネント」または「カスタム コンポーネントの実行結果」を表すと考えられます。

以下に使用例をいくつか示します。

const MyComp: React.FC<{ title: string; }> = ({title}) => <h2>{title}</h2>;

// リアクトノード
定数a: React.ReactNode =
  ヌル
  未定義 || <div>hello</div> || <MyComp title="world" /> ||
  "abc" ||
  123 ||
  真実;

// ReactElement と JSX.Element
const b: React.ReactElement = <div>hello world</div> || <MyComp title="good" />;

const c: JSX.Element = <MyComp title="good" /> || <div>hello world</div>;

ネイティブDOM関連

ネイティブ DOM 関連のタイプには、主にElementHTMLElementHTMLxxxElment含まれます。

簡単に言えば、 Element = HTMLElement + SVGElement

SVGElementは一般的な開発ではほとんど使用されませんが、 HTMLElementは非常に一般的です。そのサブタイプには、 HTMLDivElementHTMLInputElementHTMLSpanElementなどがあります。

したがって、関係はElement > HTMLElement > HTMLxxxElementであることがわかります。原則として、できるだけ詳細に記述する方がよいでしょう。

React合成イベント

React では、ネイティブ イベントが React イベントに処理され、内部的にメモリが最適化され、イベント委任を通じて DOM イベント バインディングが削減されます。話を元に戻すと、React イベントの一般的な形式は [xxx]Event で、一般的なものはMouseEventChangeEventTouchEventで、これらはジェネリック型であり、ジェネリック変数はイベントをトリガーする DOM 要素の型です。

次に例を示します。

// 入力ボックスにテキストを入力します const handleInputChange = (evt: React.ChangeEvent<HTMLInputElement>) => {
  コンソールログ(evt);
};

// ボタンクリック const handleButtonClick = (evt: React.MouseEvent<HTMLButtonElement>) => {
  コンソールログ(evt);
};

// モバイル端末タッチ div
定数 handleDivTouch = (イベント: React.TouchEvent<HTMLDivElement>) => {
  コンソールログ(evt);
};

フックとの組み合わせ

フックの中には、TS と強く関連しているものばかりではありません。たとえば、useEffect は型定義に TS に依存しません。TS と強く関連している一般的なフックをいくつか見てみましょう。

使用状態

初期値で型を記述できる場合は、useState に汎用変数を指定する必要はありません。

// ❌初期値 0 はすでにカウント型を記述しているので、これは不要です。const [count, setCount] = useState<number>(0);

// ✅これはより良いです const [count, setCount] = useState(0);

初期値が null または undefined の場合、ジェネリックを通じて予想される型を手動で渡し、プロパティにアクセスするときにオプションのチェーンを通じて構文エラーを回避する必要があります。

インターフェースIUser{
  名前: 文字列;
  年齢: 番号;
}

const [user, setUser] = React.useState<IUser | null>(null);

console.log(ユーザー名?.名前);

参照を使う

このフックは非常に特殊で、通常は 2 つの用途があります。

DOM に接続して DOM 要素を取得するために使用されます。

// DOMに接続します。初期値はundefinedではなくnullです。汎用変数を指定する場合は、HTMLxxxElementを指定する必要があります。
// 呼び出し時に inputRef.current に値が必要であることが確実な場合は、null 以外のアサーションを使用して null の後に追加できます。
const inputRef = useRef<HTMLInputElement>(null!);

const ハンドルクリック = () => {
  inputRef.current.focus(); // もちろん、非 null アサーションは必要ありません。inputEl.current?.focus() オプション チェーンを使用することもできます。}

戻る (
  <入力ref={inputRef} />
  <button onClick={handleClick}>クリック</button>
)

2. 変数を格納するために使用されます。関数コンポーネントの外部に格納されるため、useState と比較すると、非同期更新の問題や、 capture-value機能によって発生する変数の古さの問題はありません。ただし、割り当て後は ref 参照が変更されていないため、再レンダリングが発生しないことに注意してください。

// 初期値を通じてジェネリック変数の型を自動的に指定します const sum = useRef(0);

// .current を通じて sum.current = 3 を直接割り当てます。
// 非同期更新の問題はありません console.log(sum.current); // 3

セレクタの使用

useSelector はストア内の状態を取得するために使用されます。最初の固定パラメータは関数であり、関数の入力パラメータはストアです。ストアの型 RootState は、事前にストア内で定義する必要があります。一般的な定義は次のとおりです。

store.ts 内:

ルートリデューサーをストアに追加します。

エクスポート型 RootState = ReturnType<typeof rootReducer>;

使用する場合:

const { var1, var2 } = useSelector((store: RootState) => store.xxx);

カスタムフック

useState と同じ方法で配列を返す必要がある場合は、戻り値の最後に as const を使用して定数としてマークする必要があります。そうしないと、戻り値は共用体型であると推測されます。

定数useInfo = () => {
  定数[年齢、年齢の設定] = useState(0);

  return [age, setAge] as const; // 型はタプル、[number, React.Dispatch<React.SetStateAction<number>>]
};

redux関連

アクションの定義には、公式に公開されている AnyAction を使用し、アクション内のキーと値のペアの制限を次のように緩和することができます。

「redux」からAnyActionをインポートします。

定数DEF_STATE = {
  カウント: 0,
  タイプ: '整数'
};

// 制限を緩和するためにreduxのAnyActionを使用する function countReducer(state = DEF_STATE, action: AnyAction) {
  スイッチ(アクションタイプ){
    ケース "INCREASE_COUNT":
      戻る {
        ...州、
        カウント: 状態.count + 1,
      };
    ケース「DECREASE_COUNT」:
      戻る {
        ...州、
        カウント: 状態.count - 1,
      };
    デフォルト:
      状態を返します。
  }
}

デフォルトの countReducer をエクスポートします。

規則

サブコンポーネントの入力パラメータは、[コンポーネント名] Props という名前が付けられます。例:

// たとえば、現在のコンポーネント名はInfoCardです
エクスポートインターフェースInfoCardProps {
  名前: 文字列;
  年齢: 番号;
}

インターフェースタイプは大文字で始まります。

バックエンド インターフェイスの入力および出力パラメータのインターフェイスを記述し、jsdoc スタイルを使用して、次のようなエディターのプロンプトに便利なコメントを作成します。

エクスポートインターフェース GetUserInfoReqParams {
    /** 名前*/
    名前: 文字列;
    /** 年*/
    年齢: 番号;
    /** 性別*/
    性別: 文字列;
}

他の

キー名または値をどうすればよいか分からないですか?

// キー名が不明で、キー値が数値型に制限されていることを示します export interface NotSureAboutKey {
  [キー: 文字列]: 数値;
}

// キー名と値が不明な場合は、次のインターフェースが任意のオブジェクトに適用されます。エクスポートインターフェースAllNotSure {
  [キー: 文字列]: 任意;
}

インターフェースでジェネリック変数を使用するにはどうすればいいですか?

いわゆるジェネリックは事前定義された型です。その目的は、型定義におけるローカルな柔軟性を実現し、再利用性を向上させることです。通常、インターフェースではジェネリックを使用します。たとえば、次のようになります。

// 通常、インターフェースのジェネリック変数にはデフォルトの型を指定します。interface IHuman<T = unknown> {
  名前: 文字列;
  年齢: 番号;
  性別: T;
}

// 他の場所で使用する場合 const youngMan: IHuman<string> = {
    名前: 'zhangsan'、
    年齢: 18歳
    性別: '男性'
}

React プロジェクトでの TypeScript の使用に関するこの記事はこれで終了です。React での TypeScript の使用の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • ReactプロジェクトでのTypeScriptの実装
  • React+tsは二次リンク効果を実現します
  • TypeScript ジェネリックパラメータのデフォルト型と新しい厳密なコンパイルオプション
  • React でカレンダー コンポーネントを構築するためのステップ バイ ステップ ガイド
  • フロントエンド React Nextjs での TS 型フィルタリングの実用的なヒント

<<:  分散ロックの原理と3つの実装方法の詳細な説明

>>:  仮想マシンのLinux初心者がIPを設定し、ネットワークを再起動する

推薦する

Web ページのデザインを学ぶときに習得すべきコードは何ですか?

この記事では、Web ページ制作を学ぶ過程で習得すべきテクニックの一部を詳しく紹介します。これらの内...

ウェブページのフラッシュアニメーションが表示されない問題の解決策

<br />解決手順は次のとおりです。スタート -> 実行 -> reged...

ウェブサイトのアクセス速度を向上させるための徹底的な最適化に関するヒント

<br />ウェブサイトのアクセス速度はウェブサイトのトラフィックに直接影響を及ぼし、ウ...

MySQL GROUP_CONCAT 制限の解決

効果: GROUP_CONCAT関数は、フィールド値を文字列に連結することができます。デフォルトの区...

最新の人気スクリプトAutojsソースコード共有

今日は、最新の人気スクリプト 50 個を含むソース コードを共有します。現在、Mine Guard ...

SQLデータベースの14の事例の紹介

データシート /* Navicat SQLite データ転送 ソースサーバー: school ソース...

この記事ではCSSボーダーの使い方を説明します

境界線のスタイルborder-style プロパティは、表示する境界線の種類を指定します。 bord...

モバイル端末の適応により、px は自動的に rem に変換されます。

まずpostcss-pxtoremをインストールします: npm install postcss-p...

MySQL トランザクション制御フローと ACID 特性

目次1. ACIDの特性トランザクション制御構文3. トランザクション同時実行例外1. ダーティリー...

HTML ページの先頭に戻るいくつかの実装の概要

最近、ウェブサイトを開発する際にトップに戻るボタンを作成する必要がありますが、私は主にバックエンドの...

Typescript+React でモバイルと PC でシンプルなドラッグ アンド ドロップ効果を実現

この記事では、モバイルとPCで簡単なドラッグアンドドロップ効果を実現するためのTypescript ...

キーフリーログインプロセスを実現するためのLinux構成の分析

1.sshコマンドLinux では、ssh コマンドを使用して別のサーバーにログインできます。 2 ...

フォーム要素の簡単な実装コードでは登録を例に挙げています

コード実装:コードをコピーコードは次のとおりです。 <!DOCTYPE html> &l...

type=fileファイル変更フォームの名前が正常にエコーされない問題を解決

easyui フレームワークのコードは次のとおりです。 css: .ファイルボックス{ フロート:...

Nest.js 環境変数の設定とシリアル化の詳細な説明

環境変数の設定の簡単な説明プログラムは、環境によって異なる環境変数を必要とします。たとえば、実稼働環...