String リテラル型、enum 型、type ガード:TypeScript インターフェースで文字列を厳密にチェックする方法
TypeScript インターフェースで特定の文字列を必要とする方法
String リテラル型を使用する
最も簡単な方法は、String リテラル型を使用することです。
interface MyInterface {
name: "John Doe"; // 特定の文字列 "John Doe" を必須とする
age: number;
}
const person: MyInterface = {
name: "John Doe",
age: 30,
};
// 以下のコードはエラーになる
// const person: MyInterface = {
// name: "Jane Doe", // "John Doe" 以外なのでエラー
// age: 30,
// };
enum 型を使用する
複数の関連する文字列を扱う場合は、enum
型を使用すると便利です。
enum MyEnum {
JohnDoe = "John Doe",
JaneDoe = "Jane Doe",
}
interface MyInterface {
name: MyEnum;
age: number;
}
const person: MyInterface = {
name: MyEnum.JohnDoe,
age: 30,
};
// 以下のコードはエラーになる
// const person: MyInterface = {
// name: "John Doe", // 文字列ではなく MyEnum 型が必要
// age: 30,
// };
type ガードを使用する
より柔軟な方法として、type
ガードを使用できます。
type MyType = "John Doe" | "Jane Doe";
interface MyInterface {
name: MyType;
age: number;
}
const person: MyInterface = {
name: "John Doe",
age: 30,
};
// 以下のコードはエラーになる
// const person: MyInterface = {
// name: "Bob Smith", // "John Doe" または "Jane Doe" 以外なのでエラー
// age: 30,
// };
これらの方法のいずれを使用しても、TypeScript インターフェースで特定の文字列を必要とする
補足
- 上記の例では、
name
プロパティにのみ文字列を必要としていますが、他のプロパティにも同様に適用できます。 - より複雑な条件を設定したい場合は、
union
型やintersection
型などを組み合わせて使用できます。
String リテラル型を使用する
interface MyInterface {
name: "John Doe"; // 特定の文字列 "John Doe" を必須とする
age: number;
}
const person: MyInterface = {
name: "John Doe",
age: 30,
};
// 以下のコードはエラーになる
// const person: MyInterface = {
// name: "Jane Doe", // "John Doe" 以外なのでエラー
// age: 30,
// };
enum 型を使用する
enum MyEnum {
JohnDoe = "John Doe",
JaneDoe = "Jane Doe",
}
interface MyInterface {
name: MyEnum;
age: number;
}
const person: MyInterface = {
name: MyEnum.JohnDoe,
age: 30,
};
// 以下のコードはエラーになる
// const person: MyInterface = {
// name: "John Doe", // 文字列ではなく MyEnum 型が必要
// age: 30,
// };
type ガードを使用する
type MyType = "John Doe" | "Jane Doe";
interface MyInterface {
name: MyType;
age: number;
}
const person: MyInterface = {
name: "John Doe",
age: 30,
};
// 以下のコードはエラーになる
// const person: MyInterface = {
// name: "Bob Smith", // "John Doe" または "Jane Doe" 以外なのでエラー
// age: 30,
// };
複数の条件を組み合わせる
type MyType = "John Doe" | "Jane Doe";
interface MyInterface {
name: MyType;
age: number;
gender: "male" | "female";
}
const person: MyInterface = {
name: "John Doe",
age: 30,
gender: "male",
};
// 以下のコードはエラーになる
// const person: MyInterface = {
// name: "Bob Smith", // "John Doe" または "Jane Doe" 以外なのでエラー
// age: 30,
// gender: "male",
// };
// 以下のコードもエラーになる
// const person: MyInterface = {
// name: "Jane Doe",
// age: 20, // 年齢が30歳以上ではないのでエラー
// gender: "female",
// };
これらのサンプルコードは、TypeScript インターフェースで特定の文字列を必要とする方法を理解するのに役立つでしょう。
TypeScript インターフェースで特定の文字列を必要とする他の方法
const
アサーションを使用して、文字列リテラルを特定のプロパティの型として指定できます。
const name = "John Doe";
interface MyInterface {
name: typeof name; // "John Doe" 型になる
age: number;
}
const person: MyInterface = {
name,
age: 30,
};
// 以下のコードはエラーになる
// const person: MyInterface = {
// name: "Jane Doe", // "John Doe" 以外なのでエラー
// age: 30,
// };
readonly
修飾子を使用して、プロパティの値を変更できないようにすることができます。
interface MyInterface {
readonly name: "John Doe"; // "John Doe" で初期化され、変更不可
age: number;
}
const person: MyInterface = {
name: "John Doe",
age: 30,
};
// 以下のコードはエラーになる
// person.name = "Jane Doe"; // readonly なので変更不可
インターフェースの拡張を使用する
既存のインターフェースを拡張して、特定の文字列を必要とするプロパティを追加できます。
interface Person {
name: string;
age: number;
}
interface MyInterface extends Person {
// "John Doe" で初期化され、変更不可
readonly name: "John Doe";
}
const person: MyInterface = {
name: "John Doe",
age: 30,
};
// 以下のコードはエラーになる
// person.name = "Jane Doe"; // readonly なので変更不可
これらの方法は、特定の状況で役立つ場合があります。
TypeScript インターフェースで特定の文字列を必要とする方法はいくつかあります。
- String リテラル型
enum
型type
ガードconst
アサーションreadonly
修飾子- インターフェースの拡張
これらの方法を理解することで、より堅牢な TypeScript コードを書くことができます。
typescript