typeofについて
typeofはオペランド(被演算子、演算対象の変数のこと)の型を文字列として返すJavaScriptの演算子です。
オペランドと取得できる文字列の対応は以下の通りです。1
型 | 戻り値 |
---|---|
Undefined | “undefined” |
Null | “object” |
真偽値 | “boolean” |
数値 | “number” |
BigInt (ECMAScript 2020 の新機能) | “bigint” |
文字列 | “string” |
シンボル (ECMAScript 2015 の新機能) | “symbol” |
Function オブジェクト (implements [[Call]] in ECMA-262 terms) | “function” |
その他のオブジェクト | “object” |
TypeScriptにおけるtypeofについて
TypeScriptにおけるtypeof
の主な使いどころは以下の2つです。
- プリミティブ型の型ガード
- 変数の型定義の取得
以下ではそれぞれについて紹介します。
プリミティブ型の型ガード
型ガード(Type Guard)とはif文やcase文をはじめとした条件分岐で変数の型を判別し、ブロック内の変数の型を絞り込む機能のことをいいます。
typeof
によってプリミティブ型を判別できるため、プリミティブ型の型ガードを実装する際にtypeof
が利用されます。
「文字列であれば大文字に変換、数値であれば数値を文字列にして返す」というメソッドをtypeof
による型ガードを利用して実装した例が以下になります。
const convert = (value: string | number): string => {
if (typeof value === 'string') {
return value.toUpperCase(); // string型と推論される
} else {
return value.toString(); // number型と推論される
}
}
console.log(convert('hoge'))
// "HOGE"
console.log(convert(123))
// "123"
型ガードの詳細解説は【TypeScript】型ガード(Type Guard)の概要、typeofとinstanceofの利用例で紹介しています。
変数の型定義の取得
型定義の場面でtypeof 変数
を利用すると、プリミティブ型やオブジェクトのプロパティの型が取得できます。
プリミティブ型の型定義をtypeof
で取得する例は以下の通りです。
const hello: string = "Hello";
console.log(typeof hello);
// string
const hi: typeof hello = "Hi";
// 以下のように型推論される
// const hi: string
オブジェクトの型定義をtypeof
で取得する例は以下の通りです。
const taro = {
name: "Taro",
age: 20,
};
console.log(typeof taro);
// object
const jiro: typeof taro = {
name: "Jiro",
age: 22,
};
// 以下のように型推論される
// const jiro: {
// name: string;
// age: number;
// }
typeof
で取得した型を活用する例としてtypeof X[kyeof typeof X]
(オブジェクトXのプロパティの型をUnion型で表現する)があります。
typeof X[kyeof typeof X]
の詳細解説はTypeScriptの『typeof X[keyof typeof X]』の意味を順を追って理解するで紹介しています。
さいごに
Twitter(@nishina555)やってます。フォローしてもらえるとうれしいです!