TSで例えば["a", "b", "c"]のincludesがstringを受け入れない型定義をされてるのはなんで?
@syuilo
しゅいろ
(本物) これはTypeScriptの仕様と言ってしまえばそれまでですが、本質的には同値比較演算の特殊性に依存します。
比較演算は型引数 T に対して共変な引数しか取らず、共変な戻り値を返しません。加えて等号では演算が成立するための条件が弱いので、 T を上から制約するものが何もありません。つまり原理的には unknown でも演算は成立することになります (これは TypeScript における直感とも一致すると思います)
ところが、 unknown = unknown を任意に比較できてしまうとミスが起きやすいです。そこで何らかの制約を置く必要があります。
こうした場合の本来あるべき制約は、左辺と右辺が重なりを持つことです。実際TSは等号についてはこのように振る舞いますが、ライブラリ関数で同じことを行うための仕組みが不足しています。そのため苦し紛れに変性を誤魔化したような宣言が使われていると考えられます。
If you have a fediverse account, you can quote this note from your own instance. Search https://qnmd.info/users/qnighy/statuses/115865335844083095 on your instance and quote it. (Note that quoting is not supported in Mastodon.)
