型に関する世界観です。
プログラミングにおいて、なぜ、データに「型」というものが必要なのでしょうか。
それは、「型が異なる場合は、それぞれの型ごとに違う処理が必要になるから」です。
たとえば、数値が0~100である場合、それぞれの数値ごとに処理を行うのは、if文やswitch文だけでできてしまいます。別々のコードは必要ありません。
ですが、これが数値と文字列の混在であったとしたらどうでしょうか。この場合、まず数値なのか文字列なのかで、別々の処理が必要です。数値には数値向けのコードを書き、文字列には文字列向けのコードを書き、その上で数値向けのコードの中で0~100ごとの処理を行い、文字列向けのコードの中でそれぞれの文字に応じたコードを書く必要があります。
このように、データの種類に応じて別々のコードを書くために、型というものが必要とされるのです。
いわば、型とは、データそれ自体に対する「メタ情報」であると言えます。あるいは、データをやり取りするための共通の決まり事、すなわち「プロトコル」であるとも言えるでしょう。
また、RubyやJavaScriptのような型のない言語では、プログラマがどの型を変数に入れるのかを自力で想定し、プログラマが判断を行います。これは「プログラマが賢ければ動くが、馬鹿だと壊れてしまう可能性がある」ということを意味します。想定外の型が入ってプログラムが壊れるよりも、最初から想定外の型は入ることができないようにしたほうが、プログラムの安全性は高くなります。だから、TypeScriptのような「型のあるJavaScript」が必要なのです。
逆に、型のない言語のほうが優れているのは、「型という機械的なものを意識せず、ダックタイピングでプログラムが書ける」ということです。型ごとにわざわざ別の処理をするのではなく、どんな型であっても同じように動いてほしいとか、そういう「コードを簡素に書く手軽さ」のために、RubyやPythonには型が存在しません(実際にはこれらの言語にも型は存在するが、変数の宣言や関数受け渡しなどの際に明記しなくてもエラーが出ない)。C++のテンプレートなども、どんな型でも同じようにプログラムが動くという「ダックタイピング」を静的型付けのC++において実現するものであると言えます。
オブジェクト指向言語においては、関数の引数として渡す変数の型に、オブジェクトの型を指定することがあります。
これは、「必ずこのオブジェクト型の引数を与えてください」ということです。
これは、単に数値や文字列などの基本型が、オブジェクトの型になったということだけを意味していません。クラスのメソッドからクラスを使うということは、「クラス設計」を意味しているからです。
クラス設計とは、要するに「クラスから別のクラスの機能を使う」ということであり、クラスの連携手段と分割の方法を考えるということです。
このような中で、「型」は単なるデータの種類だけではなく、機能と機能が繋がり合う「インターフェース」という意味合いを持ちます。
オブジェクトの型を指定するということは、オブジェクトとオブジェクトが互いに連携し合うということです。これはクラスを使うだけではなく、クラスを自ら設計する場合には重要です。どのような型同士が連携し合うことで、プログラム全体の構造が決まるからです。
後日注記:ある意味、「変数の型がメッセージを表している」ということが言えるかもしれません。オブジェクトを渡すということは、すなわちメッセージを与えるということであり、このオブジェクトの型が、メッセージの種類と性質を示しているのです。
オブジェクト指向を参照のこと。