TypeScriptについてまとめてみた
はじめに
JavaScript がとりあえずそのまま動くので、雰囲気で使ってしまいがちな TypeScript。初心者向けに基本的なことをまとめてみました。
TypeScript って何?
TypeScript はマイクロソフトが開発したプログラミング言語で、オープンソースでメンテナンスされています。分類としては altJS の一つ。JavaScript の不足している機能を改良した言語で、JavaScript に変換(コンパイル)して実行します。
CoffeeScript と何が違うの?
altJS といわれる言語には TypeScript のほかにも Ruby on Rails で使われている CoffeeScript などがあります。CoffeeScript とは何が違うのか、同じ処理を JavaScript(ECMAScript 5)、CoffeeScript、TypeScript で書いて比較してみます。
JavaScript(ECMAScript 5)
1 2 3 4 5 6 7 8 9 10 11 |
function Person(name) { this.name = name; } Person.prototype.say = function(message, count) { for (var i = 1; i <= count; i++) { console.log(this.name + " says " + message + " " + i); } } var person = new Person("Bill"); person.say("Hello!", 3); |
ECMAScript 5 までの JavaScript は class構文がないため、クラス定義に prototype
を使う必要があり、オブジェクト指向プログラミングを行うには工夫が必要でした。
CoffeeScript
1 2 3 4 5 6 7 8 |
class Person constructor: (@name) -> say: (message, count) -> for i in [1..count] console.log """#{@name} says #{message} #{i}"""; person = new Person "Bill"; person.say "Hello!", 3; |
CoffeeScript だとクラス定義をすっきり書けますが、関数呼び出しやループが Ruby に近い書き方になっていて JavaScript とはだいぶ違っています。
TypeScript
1 2 3 4 5 6 7 8 9 10 11 |
class Person { constructor(private name: string) {} public say(message: string, count: number) { for (let i = 1; i <= count; i++) { console.log(`${this.name} says ${message} ${i}`); } } } const person = new Person("Bill"); person.say("Hello!", 3); |
TypeScript では JavaScript のコードをそのまま使えます。ループや条件分岐、関数呼び出しなどの JavaScript の構文はそのままで、それに追加して静的型付けやクラス宣言ができるようになっています。
JavaScript と何が違うの?
TypeScript を使う一番のメリットは、間違った型の代入を防げること(静的型付け)です。
JavaScript
1 2 3 4 |
var count; count = 0; count ++; count = "Steve"; |
JavaScript では変数の型を指定することができないため、数値として使っている変数(count
)に文字列("Steve"
)を代入することができてしまいます。
TypeScript
1 2 3 4 |
var count: number; count = 0; count ++; count = "Steve"; // コンパイルエラー |
TypeScript では、変数の型(number
)を指定することができるので、数値として使っている変数(count
)に文字列("Steve"
)を代入すると、コンパイルエラーとして指摘されます。
実は、このコロン(:
)を使った静的型付けは JavaScript の仕様である ECMAScript 4 で提案されていたのですが、ECMAScript 4 はお蔵入りとなってしまいました……なので、JavaScript で型チェックを行いたい場合は TypeScript などの altJS が必要になるのです。
また、TypeScript 独自の型情報は JavaScript にコンパイルすると消えてしまいます(型消去)。
TypeScript(コンパイル前)
1 2 3 4 5 6 7 8 9 10 |
interface IMessage { text: string; count: number; } var message: IMessage = { text: "Hello!", count: 3 }; var i: number; for (i = 1; i <= message.count; i++) { console.log(message.text + " " + i); } |
JavaScript(コンパイル後)
1 2 3 4 5 |
var message = { text: "Hello!", count: 3 }; var i; for (i = 1; i <= message.count; i++) { console.log(message.text + " " + i); } |
コンパイル後のコードを見ると、インタフェース(IMessage
)は定義から綺麗さっぱり無くなっていて、コロン(:
)の後ろにある型情報も無くなっています。
ECMAScript 6 と何が違うの?
class
構文によるクラスの定義など TypeScript のいくつかの機能は ECMAScript 6(ECMAScript 2015)を先取りしたものです。TypeScript から JavaScript へのコンパイル時にはターゲットとして ECMAScript 3、5、6(2015)、2016、2017 が指定できて、それぞれ変換結果が異なります。
TypeScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
interface IMessage { text: string; count: number; } class Person { constructor(private name: string, private age: number) {} public say = (message: IMessage) => { for (let i = 1; i <= message.count; i++) { console.log(`${this.name}(${this.age}) says ${message.text} ${i}`); } } } const person = new Person("Bill", 62); person.say({ text: "Hello!", count: 3 }); |
JavaScript(ECMAScript 5 をターゲットにしてコンパイルした結果)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
var Person = /** @class */ (function () { function Person(name, age) { var _this = this; this.name = name; this.age = age; this.say = function (message) { for (var i_1 = 1; i_1 <= message.count; i_1++) { console.log(_this.name + "(" + _this.age + ") says " + message.text + " " + i_1); } }; } return Person; }()); var person = new Person("Bill", 62); person.say({ text: "Hello!", count: 3 }); |
JavaScript(ECMAScript 6 をターゲットにしてコンパイルした結果)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class Person { constructor(name, age) { this.name = name; this.age = age; this.say = (message) => { for (let i = 1; i <= message.count; i++) { console.log(`${this.name}(${this.age}) says ${message.text} ${i}`); } }; } } const person = new Person("Bill", 62); person.say({ text: "Hello!", count: 3 }); |
ターゲットを変えてコンパイルすると、型消去が行われている点は同じなのですが、class
構文や let
、const
、アロー構文、テンプレートリテラルなど ECMAScript 6 標準の機能の変換の有無で違いが出ています。また ECMAScript 5 では this
や let
で定義された変数のスコープを配慮して変数名が変更されていることもわかります。
ECMAScript 6 の機能に加えて静的型付けなどが使えて、ECMAScript 5 しか対応していないブラウザ向けにも変換できるのが TypeScript ということですね。
動かしてみる
簡単に実行するには TypeScript Playground を使ってブラウザで確認できます。
ローカルで実行する場合は npm
で tsc コマンドをインストールして TypeScript のファイルを JavaScript に変換(コンパイル)できます。
1 2 |
$ npm install -g typescript $ tsc hello.ts |
統合開発環境としては Visual Studio Code が便利です。
参考
- TypeScript Documentation(公式ドキュメントです)
- TypeScript実践プログラミング(内容は良いのですが、執筆時点の TypeScript のバージョンがちょっと古いので注意が必要です)
※ DACはエンジニアを募集しています! 興味のある人はバナー(↓)からどうぞ

関連記事
-
-
ECMAScript6を使ってみた ~「Promise」編
ECMAScript6とは 一応ちょっとだけ説明しておくと、 ECMAScript(エクマスクリプト)は、Ecma Internationalによって標準化されたスクリプト言語で、バージョン6が2015 年 6 月 17 日に標準仕様として発行されました。(以下、ES6と呼びます) ES6ではcon …
-
-
Polymer core-ajax の使い方
Polymerのcore-ajaxの使い方。 まずは、index.html [code language=”html” title=”index.html”] <!doctype html> <html> <head> …
-
-
Scala実践「Either型を使ってimmutable(不変)なコードを書こう!」
はじめに みなさんこんにちは、プロダクト開発本部の亀梨です。 普段はXmediaOneというメディアプランニング・広告運用管理・トラッキング・マーケティング分析を行う 統合プラットフォームの開発を担当しています。 Scalaでイケてるコードを書きたい! 背景 わたくしはDACに入社してからScala …
-
-
【小ネタ】Javascriptのconsoleオブジェクトをもっと便利に使う方法
すごく便利なconsoleオブジェクトですが、ブラウザによってサポートされているメソッドが なかったり、そもそもconsoleオブジェクトが使えなかったりと、たまに不便だったりします。 そんなときによく使う便利なコード。 [code language=”javascript” …
-
-
gulp.jsで広告タグの開発環境を整える
SEOの観点から、サイト表示速度の高速化のためJavaScriptファイルから不用な空白や改行、 コメントを除去したりやローカル変数名を短縮するminifyが奨励されていますが、 これはタスクランナーのgulp.jsとプラグインを使って自動化する事が可能です。 ※gulpの基本的な使い方については下 …
-
-
プログラミング初心者がswiftでゲームアプリ的なものを作ってみた。
こんにちは、DAC2年目のkumataです。 普段は素敵な先輩方に囲まれてインフラ周りのお仕事をさせて頂いていますが、 今回は業務とは全く関係ないプログラミングをやってみました。 全く初心者なのですが、swift+Xcodeで簡単にスマホゲーム的なものが作れました。 初心者の目線から作成方法をつらつ …
-
-
Scala入門 準備編「開発環境構築」 – PHP使いからScala使いへ転身!
はじめに みなさんこんにちは、今月入社しましたプロダクト開発本部の亀梨です。 普段はXmediaOneというメディアプランニング・広告運用管理・トラッキング・マーケティング分析を行う 統合プラットフォームの開発を担当しています。 XmediaOneの開発で採用しているプログラム言語はS …
-
-
ディープラーニングで「顔が似ているAKB48のメンバーを教えてくれるbot」を構築
概要 こんにちは、システム開発部の中村です。 今回は、Facebook Messenger APIを利用して、 画像をアップロードすると、似ているAKB48のメンバーを教えてくれるbotを実装しました。 尚、ディープラーニングやTensorFlowそのものの解説というより、 「エンジンとしてディープ …
-
-
D3.jsとその活用事例について
D3.jsとは? D3とは「Data Driven Document」の略で、データに基づいてドキュメントを操作するための JavaScript ライブラリです。 ご存知の方も多いと思いますが、ちょっとだけD3.jsの基本的な使い方、そして弊社プラットフォームでの利用についてご紹介したいと思います。 …
-
-
iOS端末情報をTreasureDataに送るアプリをswiftで作ってみた。
はじめまして、2年目のOyamanです。 通常業務とは別のことになりますが、Swiftに触れる機会が少しあったので、スマホ関連の記事を書かせていただきます。 はじめに SwiftとTreasureDataのSDKを使って、 iOSの端末情報をTreasureDataへ送るアプリを作ってみます。 今回 …