型推論と動的型付けの違い
型を書かないという意味では、JavaScriptをはじめRubyやPHPなどの動的型付け言語でも同様です。型推論と動的型付けは何が違うのでしょうか?
型推論はコンパイルのタイミングで型が決定され、その型が変更されることはありません。型をプログラマが書くかコンパイラが自動で決めるという点で違いがあり、あくまで静的型付けの世界に閉じた話になります。
次のTypeScriptの例では、変数x
が型推論により number
型として決定され、以降は常に number
型として振舞います。
TypeScriptts
letx = 1;Type 'string' is not assignable to type 'number'.2322Type 'string' is not assignable to type 'number'.= "hello"; // xはnumber型と決定しているのでstring型を代入するとエラー x Property 'substring' does not exist on type 'number'.2339Property 'substring' does not exist on type 'number'.console .log (x .(1, 3)); substring
TypeScriptts
letx = 1;Type 'string' is not assignable to type 'number'.2322Type 'string' is not assignable to type 'number'.= "hello"; // xはnumber型と決定しているのでstring型を代入するとエラー x Property 'substring' does not exist on type 'number'.2339Property 'substring' does not exist on type 'number'.console .log (x .(1, 3)); substring
一方、動的型付けでは実行時に型が決まるので、実行タイミングにより型が変化します。次のJavaScriptの例では、最初に1
の値が代入され変数x
の型はnumber
型となります。その後、hello
の文字列を代入することで 変数x
の型は string
型に変更されます。このように実行タイミングで型が変化するので、型推論ではエラーになる処理も動的型付け言語では正常に動作します。
JavaScriptts
let x = 1; // xはnumber型となるx = "hello"; //x はstring型となるconsole.log(x.substring(1, 3)); //=> "el"
JavaScriptts
let x = 1; // xはnumber型となるx = "hello"; //x はstring型となるconsole.log(x.substring(1, 3)); //=> "el"