TypeScript型抽出方法解説
TypeScriptインターフェースのプロパティ型を抽出する方法
キーによるアクセス:
直接プロパティ名を使用して型を取得します。
interface Person {
name: string;
age: number;
}
type NameType = Person['name']; // string
keyof演算子:
インターフェースのすべてのプロパティキーの型を取得します。
interface Person {
name: string;
age: number;
}
type PersonKeys = keyof Person; // "name" | "age"
ジェネリック型:
任意のインターフェースのプロパティ型を抽出するジェネリック型を作成できます。
type PropertyType<T, K extends keyof T> = T[K];
interface Person {
name: string;
age: number;
}
type NameType = PropertyType<Person, 'name'>; // string
Extract型:
特定の型から抽出したい型を指定します。
interface Person {
name: string;
age: number;
isAdult: boolean;
}
type StringProperties = Extract<keyof Person, string>; // "name"
Mapped Types:
interface Person {
name: string;
age: number;
}
type ReadonlyPerson = {
readonly [P in keyof Person]: Person[P];
};
注意
- TypeScriptの型システムは非常に強力で柔軟性がありますが、複雑な型を扱う場合は注意が必要です。
definitelytyped
は、TypeScriptプロジェクトで使用される外部ライブラリの型定義を提供するリポジトリです。これらの型定義を使用すると、ライブラリのインターフェースのプロパティ型を抽出できます。
TypeScript型抽出方法解説
interface Person {
name: string;
age: number;
}
type NameType = Person['name']; // string
interface Person {
name: string;
age: number;
}
type PersonKeys = keyof Person; // "name" | "age"
type PropertyType<T, K extends keyof T> = T[K];
interface Person {
name: string;
age: number;
}
type NameType = PropertyType<Person, 'name'>; // string
interface Person {
name: string;
age: number;
isAdult: boolean;
}
type StringProperties = Extract<keyof Person, string>; // "name"
interface Person {
name: string;
age: number;
}
type ReadonlyPerson = {
readonly [P in keyof Person]: Person[P];
};
条件付き型:
条件に基づいて型を抽出します。
type IsString<T> = T extends string ? true : false;
interface Person {
name: string;
age: number;
}
type StringProperties = keyof {
[P in keyof Person]: IsString<Person[P]> extends true ? P : never;
}; // "name"
Pick型:
指定したプロパティのみを抽出します。
interface Person {
name: string;
age: number;
isAdult: boolean;
}
type NameAndAge = Pick<Person, 'name' | 'age'>; // { name: string; age: number; }
Omit型:
interface Person {
name: string;
age: number;
isAdult: boolean;
}
type WithoutAge = Omit<Person, 'age'>; // { name: string; isAdult: boolean; }
Exclude型:
特定の型を除外します。
interface Person {
name: string;
age: number;
isAdult: boolean;
}
type NonStringProperties = Exclude<keyof Person, string>; // "age" | "isAdult"
NonNullable型:
null
またはundefined
を除外します。
interface Person {
name: string;
age: number | null;
}
type NonNullablePerson = {
[P in keyof Person]: NonNullable<Person[P]>;
}; // { name: string; age: number; }
typescript typing definitelytyped