型指定はsatisfiesを使っておけば大体大丈夫な理由【Typescript】
satisfies
の挙動を勉強した際に、一般的に型指定に使われる「型注釈」やas
と比較して優秀な特徴があることが分かったので記事にしてみました
vs 「型注釈」
「型注釈」とsatisfies
は、型を満たしているかどうかを判定するという点では同じです
しかし、
「型注釈」はオブジェクトが保持している型を上書きしてしまうのに対して、
satisfies
は元の型の情報を保持した上で型を判定してくれます
これを具体的なコードで説明すると、「型注釈」の場合、下記のコードでエラーが発生します
// 「型注釈」の場合
const result: {type: 'success' | 'error'} = {type: 'success'};
const success: {type: 'success'} = result;
// ^^^^^^^^ Error発生!
このエラーが発生する理由は、result
の型が「型注釈」により{type: 'success' | 'error'}
に上書きされてしまい、型{type: 'success'}
を満たさなくなってしまうからです
一方で、satisfies
を使うと、このようなエラーは発生しません
// satisfiesの場合
const result = {type: 'success'} satisfies {type: 'success' | 'error'};
const success: {type: 'success'} = result;
satisfies
では、result
の型が{type: 'success'}
のまま保持されるため、success
に代入することができます
これを図で表すと、
元の型の状態を保持したまま、型の判定をしたい場合は、satisfies
を使うのが有効です
as
vs as
は型指定が間違えててもエラーが検出されず、実際に動かしてみるまで分からない場合があるのに対して、satisfies
は型指定を間違えていたらエラーを検出してくれます
例えば、次のコードのような挙動を引き起こします
// asの場合
const result = {type: 'success'};
const error: {type: 'error'} = result as {type: 'error'};
// Errorが検出されない!
// satisfiesの場合
const result = {type: 'success'};
const error: {type: 'error'} = result satisfies {type: 'error'};
// ^^^^^^^^^ Error検出
as
を使ってしまうと、実際に動かしてみるまで型の間違いに気付けないので、特別な理由がない限りはsatisfies
を使う方が安全です
まとめ
satisfies
が、「型注釈」やas
と比較してどのように有用か解説してみました
とはいえ、satisfies
だと実現できない挙動もあったり、チームによってはsatisfies
を知らない人もいると思うので、上手に使い分けていきたいなと思います
また余談ですが、型の挙動を簡単に確認したい場合は、TypeScript Playgroundを使うのがおすすめです
Discussion