💉

TypeScriptのtypeofを知ろう

に公開

概要

別記事を書くにあたりtypeofを理解しようの会

typeofとは

指定した変数やプロパティの型を抽出して定義するもの。
参考: https://www.typescriptlang.org/docs/handbook/2/typeof-types.html

let s = "hello";
let n: typeof s; // string

let l = [1, 2, 3];
let m: typeof l; // number[]

ちなみに、配列に対して以下のような書き方をすると要素の型を抜き出せる。

let l = [1, 2, 3];
let m: typeof l; // number[]
let p: (typeof l)[number]; // number

number[]のインデックスに[number]でアクセスすることで要素の型を抜き出せる。

constにおけるtypeof

constを用いて指定した場合は以下のようになる。

const s = "hello";
let n: typeof s; // リテラル型 "hello"

const l = [1, 2, 3];
let m: typeof l; // number[]

プリミティブのな型であるstring、number、booleanについてはリテラル型になり、
それ以外はできる限り推論した型にしてくれる。
[1, 2, 3]だとnumber[]とか。{ name: "ほげ", age: 20 }だと{ name: string; age: number; }とか。
参考: https://www.typescriptlang.org/docs/handbook/2/everyday-types.html

JavaScriptのtypeofとの違いは??

JavaScriptにもtypeofが存在し、それも型を返してくれるものなので困惑する。
が、JavaScriptのtypeofはあくまでも「型名を表示してくれる」ためのものでTypeScriptの「型を抽出し定義するもの」とはちょっと異なる。

JavaScriptでの使用例
let s = "hello";
let n = typeof s;
console.log(n); // "string" が表示される
TypeScriptでの使用例
let s = "hello";
let n: typeof s;
console.log(n); // undefined が表示される(型定義しただけで値は格納していないので)

ちなみに、TypeScrtiptのファイルでも console.log(typeof s) は使用できるが、これはJavaScriptのtypeofが作動している。

TypeScriptでは上記のtypeofがどっちも使用できてしまうからややこしくなってしまっているかも。

Discussion