TypeScriptタイピングのコツ:高速コーディングのためのTypeScript構文マスター
TypeScriptコードを素早く入力するための必須テクニックを学びましょう。型アノテーション、ジェネリクス、インターフェースからユーティリティ型、高度なパターンまで、TypeScriptのタイピング速度と正確性を向上させます。
TypeScriptはスケーラブルなJavaScriptアプリケーション構築の標準となっています。その強力な型システムはコンパイル時にエラーを検出しますが、TypeScriptコードを効率的に入力するには、その独自の構文パターンをマスターする必要があります。この包括的なガイドでは、TypeScriptをより速く、より少ないエラーで入力する方法を解説します。
TypeScriptタイピングスキルが重要な理由
TypeScriptはJavaScriptに型アノテーションを追加するため、入力する文字数が増えます。しかし、エラーを早期に発見できる生産性の向上は、追加のキー入力をはるかに上回ります。TypeScriptを流暢に入力できる開発者は、デバッグに費やす時間が減り、機能構築により多くの時間を使えます。
マスターすべきTypeScriptの必須記号
コロン (:)
変数、パラメータ、戻り値の型アノテーションに使用。
山括弧 (<>)
ジェネリクス、型アサーション、JSX要素に必須。
パイプ (|)
複数の型を組み合わせるユニオン型。
アンパサンド (&)
複数の型を組み合わせるインターセクション型。
クエスチョンマーク (?)
オプショナルプロパティとオプショナルチェイニング。
基本的な型アノテーションパターン
型アノテーションはTypeScriptの基礎です。自然に入力できるまで練習しましょう:
const name: string = 'Alice';
const age: number = 30;
const isActive: boolean = true;const items: string[] = ['a', 'b', 'c'];
const numbers: Array<number> = [1, 2, 3];const user: { name: string; age: number } = {
name: 'Bob',
age: 25,
};関数の型パターン
TypeScriptの関数にはパラメータと戻り値の型アノテーションが必要です:
function greet(name: string): string {
return `Hello, ${name}!`;
}const add = (a: number, b: number): number => {
return a + b;
};function fetchUser(id: number): Promise<User> {
return api.get(`/users/${id}`);
}function process(data: string, callback: (result: string) => void): void {
callback(data.toUpperCase());
}インターフェースパターン
インターフェースはオブジェクトの形状を定義し、TypeScriptの基本です:
interface User {
id: number;
name: string;
email: string;
}interface Config {
readonly apiUrl: string;
timeout?: number;
retries: number;
}interface Repository<T> {
find(id: number): Promise<T>;
save(item: T): Promise<void>;
delete(id: number): Promise<boolean>;
}interface ApiResponse<T> {
data: T;
status: number;
message: string;
}型エイリアスパターン
型エイリアスはカスタム型名を作成します:
type ID = string | number;type Status = 'pending' | 'active' | 'completed';type Point = {
x: number;
y: number;
};type Callback<T> = (data: T) => void;type Nullable<T> = T | null | undefined;ジェネリクスパターン
ジェネリクスは再利用可能で型安全なコードを実現します:
function identity<T>(value: T): T {
return value;
}function map<T, U>(items: T[], fn: (item: T) => U): U[] {
return items.map(fn);
}class Container<T> {
constructor(private value: T) {}
getValue(): T {
return this.value;
}
}interface State<T> {
data: T;
loading: boolean;
error: Error | null;
}ユニオン型とインターセクション型
型を組み合わせて柔軟性を高めます:
type StringOrNumber = string | number;type Result<T> = { success: true; data: T } | { success: false; error: string };type Named = { name: string };
type Aged = { age: number };
type Person = Named & Aged;function handle(value: string | number | boolean): void {
if (typeof value === 'string') {
console.log(value.toUpperCase());
}
}ユーティリティ型パターン
TypeScriptには組み込みのユーティリティ型があります:
type PartialUser = Partial<User>;type RequiredConfig = Required<Config>;type ReadonlyUser = Readonly<User>;type UserKeys = keyof User;type NameType = User['name'];type UserWithoutId = Omit<User, 'id'>;type UserIdAndName = Pick<User, 'id' | 'name'>;クラスパターン
TypeScriptのクラスはアクセス修飾子とインターフェースをサポートします:
class User {
constructor(
public name: string,
private age: number,
readonly id: string
) {}
}class Service implements IService {
private cache: Map<string, Data> = new Map();
async fetch(id: string): Promise<Data> {
return this.cache.get(id) ?? await this.load(id);
}
}abstract class BaseRepository<T> {
abstract find(id: number): Promise<T>;
abstract save(item: T): Promise<void>;
}型ガードパターン
型ガードは実行時に型を絞り込みます:
function isString(value: unknown): value is string {
return typeof value === 'string';
}function isUser(obj: unknown): obj is User {
return typeof obj === 'object' && obj !== null && 'name' in obj;
}if (value instanceof Date) {
console.log(value.toISOString());
}非同期パターン
非同期コードを適切に型付けします:
async function fetchData(): Promise<Data[]> {
const response = await fetch(url);
return response.json();
}const getData = async (): Promise<Result<User>> => {
try {
const user = await api.getUser();
return { success: true, data: user };
} catch (error) {
return { success: false, error: String(error) };
}
};React with TypeScriptパターン
Reactアプリケーションでよく使うパターン:
interface Props {
title: string;
onClick: () => void;
children?: React.ReactNode;
}const Button: React.FC<Props> = ({ title, onClick }) => {
return <button onClick={onClick}>{title}</button>;
};const [count, setCount] = useState<number>(0);
const [user, setUser] = useState<User | null>(null);const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setValue(e.target.value);
};モジュールとインポートパターン
TypeScriptコードの整理方法:
import type { User, Config } from './types';
import { fetchUser, saveUser } from './api';export interface ApiResponse<T> {
data: T;
status: number;
}export type { User, Config };
export { UserService, ConfigService };TypeScript練習のコツ
山括弧 <> に集中する - ジェネリクスで常に使用
変数名の後、型の前のコロン : の配置を練習
ユニオン型のパイプ | とインターセクションのアンパサンド & をマスター
ジェネリクス制約の extends キーワードに慣れる
keyof、typeof、インデックスアクセス型を練習