Open3
TypeScriptのanyを理解する
- 値をany型にすると、type checkのエラーが出なくなる
- anyの値に対しては、どんなプロパティにもアクセスできるし、関数としても呼び出せるし、どんな型の値にもassignできる。なんでもできる
似たような型に、unknownがある。
- unknownは、「任意の値」を表す型だが、その値に対して、あらゆるプロパティアクセスや関数呼び出しが禁止されるので安全。
- unknown型は、「なんか未知の型を引数として受け取る関数」の引数の型としてanyの代わりに用いたり、「返り値の型が任意になりうる関数」の返り値の型として用いたりできる(下記)
function safeParse(s: string): unknown {
return JSON.parse(s);
}
// Need to be careful with 'obj'!
const obj = safeParse(someRandomString);
やや奇妙に思える?振る舞いとして、anyとconditional typeの組み合わせがある。
下記の型は、「anyがあらゆる型を包含する」という視点では、true
に決まりそうだが、実際はboolean
となる。
type T = any extends string ? true : false
これに関しては議論がされており、TypeScriptの仕様らしい。
any is treated like a wildcard that matches both branches
と回答されており、anyはワイルドカード的な振る舞いをするため、どちらのbranchにも入ってしまうとのこと。