TypeScript で `as unknown as` という二重キャスト(Double Assertion)が必要になるのはどのような場合ですか?
1〜4キーで選択、Enterで回答できます
解説
正解は「互いに互換性のない2つの型の間で強制的にアサーションしたいとき」です。as による型アサーション(コンパイラに型を教える書き方)は、変換元と変換先に何らかの互換性がある場合しか許可されません。as unknown as は、その制約を意図的に迂回するための書き方です。2段階なら通る理由TypeScript は「A から B へのアサーションは、A が B のサブタイプか、B が A のサブタイプのときだけ許可する」というルールで動きます。unknown はすべての型の上位にあたるため、どんな型からでも as unknown は成功します。そして任意の型は unknown の下位にあたるので、unknown からも任意の型へ変換できます。const input: string = 'hello'; // エラー: string と number に互換性がない // const num: number = input as number; // OK: string → unknown → number の2段階なら通る const num: number = input as unknown as number;他の選択肢との違いany からの変換: any はすべての型と互換とみなされるため、as T 一段で足ります。unknown を型ガードなしで使う: 二重キャストは型チェックを外すだけで、安全性は何も担保しません。目的が逆です。ジェネリクスの型パラメータ指定: identity<string>(x) のような型引数の明示であり、アサーションとは別の機能です。「unknown を挟むと安全になる」は誤りany より優れているのは安全性ではなく、「ここで意図的に型システムを外している」とコード上に残せる点だけです。実行時の型不一致のリスクは any と変わらず自分で引き受けることになります。許容される場面と、見直しのサイン外部ライブラリの型定義が実態と合っていない場合の回避策や、テストでモックをインターフェースに合わせる場合などに限られます。// テストで頻出。型チェックを外している自覚が必要 const mockService = { fetchData: jest.fn().mockResolvedValue({ id: 1 }), } as unknown as UserService;プロダクションコードで多用しているなら、型設計そのものを見直す合図です。Type Assertions - TypeScript Handbook