1 of 8

unknown型を使おう

anyやめませんか

2 of 8

自己紹介

  • 三宮在住のシステムエンジニア
  • システム何でも屋
    • 業務用クラサバシステムから帳票・バッチ、レガシー・モダンWeb開発まで
    • フロントエンド、バックエンド、DB設計、インフラ

3 of 8

unknown型とは

  • TypeScript 3.0で導入された型
  • 型安全に不明な型を処理するためのもの
    • anyのようなもの

4 of 8

unknownとanyの比較

  • unknown

  • any

5 of 8

unknown型を処理する例

  • 型検査を実装することで適切に扱うことができる

6 of 8

ユースケース

  • anyを使うケースでは基本的にはunknown型を受け取り、型検査をしたうえで処理する
  • unknown型のままでいいものは、型検査をしない
    • これによって使わない値として責務を分けることができる
  • { [key: string]: any }も可能であればunknownにするとより型安全になる
    • どうしても難しい場合でも{ [key: string]: unknown }

7 of 8

unknown型を使う上での長短

  • Pros
    • 型の保証を得やすい
      • 例えばany型変数を引き回すと型の保証がないが、unknownであれば保証しやすい
    • 型を騙すのに使える
      • “hoge” as unknown as numberと書くことで数値型にできる
      • 実装と設計の乖離のようなことが発生するので極力回避したいが現実的には必要なケースもある
  • Cons
    • 型検査のコストが重い
      • 型検査の処理が必要であり、パフォーマンスが犠牲になる

8 of 8

最後に

  • そもそも不明な型を発生させないことが大切
    • API要求や応答を始めとした外部値は必要がない限り仕様通りの値が来るものとして解釈し、異常な型が来て処理が続行できない場合は言語側のランタイムエラーに任せるのも一つ
    • もちろん、異常値を許さない処理であればバリデーションする必要はある
  • 複数の型が来ることを想定する場合はジェネリクスやUnion型、クラスなどを用いるのも一つ
    • <Hoge>, <Hoge extends Piyo>, ‘hoge’ | ‘piyo’ | ‘fuga’
  • Anyを許さない設定にする
    • tsconfig.json
      • “noImplicitAny”: true
    • ESLint
      • plugin:@typescript-eslint/recommended
      • “@typescript-eslint/no-explicit-any”: “error”