2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【TypeScript初心者】any,unknownを理解する

Posted at

はじめに

「読んで学ぶTypeScript」をちょっとずつ読み進めます!
今回は、any,unknownについてです!


コーディングに慣れていないので、ところどころ用語を調べて記載しながら書きますmm
そのため、初心者の方が理解するには、助けになるかもしれません :crab:


any型

  • どんな値でも代入を許す型
  • 何を代入してもエラーにならない
let value: any; // any型

value = 1; // 代入OK
value = "string"; // 代入OK
value = { name: "オブジェクト" }; // 代入OK
  • 型推論できない時、TypeScriptは暗黙的にany型として扱う
function processData(data) {
  // dataの型注釈が省略されているため、any型として判定する
  return data.toUpperCase();
}

any型の注意点

  • 型注釈でanyにした or 暗黙的にany型として扱われた場合、コンパイラーが警告しなくなる
function processData(data) {
  // dataの型注釈が省略されているため、any型として判定する
  return data.toUpperCase();
  // dataはany型とされているため、`toUpperCase`(string型のメソッド)の存在をチェックしない
}

processData(1);
// `toUpperCase`は、string型のメソッドでnumber型には存在しないため、実行してみるとエラーになる

anyは型チェックをすり抜けて実行時エラーを引き起こす可能性がある


:pencil: 上記の問題を解決する noImplicitAny

  • tsconfig.jsonnoImplicitAny: true を設定する
  • TypeScriptが型をany型と推測した場合に、エラーが発生するようになる

tsconfig.json とは

  • TypeScript プロジェクトの設定ファイル
  • プロジェクト全体の情報やコンパイルオプションなどを記載する
    • コンパイルオプション:TypeScriptコードをJavaScriptに変換する際の挙動の設定

unknown型

  • 型が何かわからないときに使う型
  • どんな値も代入できる
let value: unknown; // unknown型
value = 1; // 代入OK
value = "string"; // 代入OK
value = { name: "オブジェクト" }; // 代入OK
  • どんな値にも代入できるが、unknown型の値は具体的な型へ代入できない(代入互換性がない)
const value: unknown = 10; 
const int: number = value; //Error: unknown型のvalueは number型には代入できない
  • また、unknown型は「プロパティへのアクセス・メソッドの呼び出し」もできない
const value: unknown = 10;
value.toFixed(); // Error: valueはunknown型なので、number型のメソッド(toFixed)は使えない

unknownはanyよりも安全だが、そのままだと実用的ではない

unknown型を使う方法

  • unknownの値を使うために、型を絞り込む
  • 型の絞り込みには、typeofinstanceof などを条件式に含んだif文を使う
    • 型ガードと呼ばれる
const value: unknown = "";
if (typeof value === "string") {
//  ^^^型ガード、valueをstring型として扱える
  console.log(value.toUpperCase());
}

typeof

  • JavaScriptの演算子(TypeScriptの型ガード)
  • typeof演算子をifやswitchと併せてつかうと、条件と合致したときにその変数をその型として扱えるようになる
  • プリミティブ型 (string, number, boolean, symbol, bigint, undefined)、関数 (function)、および オブジェクト (object, null)の判別に使用される

instanceof

  • JavaScriptの演算子(TypeScriptの型ガード)
  • 特定のオブジェクトがクラスのインスタンスかをチェックするJavaScriptの演算子
  • ifやswitchと組み合わせて使うと、条件と合致したときにそのオブジェクトの型を、指定したクラスかその派生クラスのインスタンスである型に絞り込める

anyunknown

  • any型とunknown型はどんな値も代入できる

  • any型の値はどんな型にでも代入できる
  • unknown型の値はどの型にも代入できない(代入互換性がない)

image.png


anyunknown の使いわけ

  • 基本は型の確認を強制できる安全な unknown を使うとよい
  • 型チェックをスルーしてとりあえず動かしたいなら、any

さいごに

anyにはなんとなく危ないイメージを持ってましたが、今回の記事を書いていて特徴を掴めました!
unknownを使う際の方の絞り込み方はもう少し気になります :eyes:

アドカレ2025が開催中! :christmas_tree:

今年もアドカレ開催中です :santa:
面白そうなカレンダーがたくさんです!

特設サイト ↓

ギフトカードや Airpods, iPadなど、豪華賞品すぎるプレゼントカレンダーは必見!:eyes:

参考

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?