SlideShare a Scribd company logo
JavaScript使いのための
TypeScript実践入門
2016/08/24
株式会社オープンウェブ・テクノロ
ジー
白石 俊平
本日のアジェンダ
• 自己紹介
• 書きながら学ぶTypeScript
• TypeScriptを仕事で使う
• TypeScriptのメリット・デメリット
• まとめ
• おまけ
自己紹介
• html5jファウンダー
• HTML5 Experts.jp編集長
• 株式会社オープンウェブ・テクノロジー
CEO
– TechFeedというサービスをやっています
TechFeed
• エンジニア向けキュレーションサービス
– 世界中からテック情報収集してランク付けしてます。
• 速い、深い、面白い!
• モバイルアプリはTypeScript(Angular2)で作ってます。
ぜひ使ってみてください。
http://techfeed.io
TechFeed
http://techfeed.io
http://facebook.com/techfeedapp
http://twitter.com/techfeedapp
最先端が、ここにある。
書きながら学ぶTypeScript
TypeScriptとは?
ES.next + 型 + α
ざっくり言い過ぎると
ライブコーディング
• https://goo.gl/zferqi にアクセス
TypeScript Playground
ES.nextな部分を試してみる
• ECMAScript6以降で導入された言語仕様は多
岐に登るが、その中でも特に仕様頻度が高い
ものを紹介
– 変数
– 文字列
– 配列
– オブジェクトリテラル
– デストラクチャリング
– 関数
– クラス
ES.nextな部分を試してみる:
変数
• letやconstが使えます。
– let: スコープが {...} に限定された変数の定義
• varは、関数スコープしか持たない
– const: 再代入不可のlet
• 正直、varの出番はもうありません
– ぼくらは、「基本const、たまにlet」というルールでやっ
てます
let a ='Hello';
const b = 'World';
b = 'Error'; // 再代入不可
ES.nextな部分を試してみる:
文字列
• テンプレート文字列
– バッククォートで囲んだ文字列内では、"${ }"
を使って式を埋め込める
let a ='Hello';
const b = 'World';
const c = `${a}, ${b}`;
ES.nextな部分を試してみる:
配列
• spread演算子
– 配列の中身をいい感じに展開
• for...of
– 配列(正確にはイテレータ)をループ処理
let a ='Hello';
const b = 'World';
const c = `${a}, ${b}`;
const d = [a, b];
const e = [1, 2, ...d]; // [1, 2, 'Hello', 'World']
e.push(...d); // [1,2,'Hello','World','Hello','World']
for (let f of e)
console.log(f); // 1, 2, Hello, World
ES.nextな部分を試してみる:
オブジェクトリテラル
• Property Shorthand
– 変数名と同名のプロパティを簡単に定義
– {a: a} みたいなのを {a} で宣言できる
– 個人的には異様に便利
• Computed PropertyNames
– {[式]: 値} とすることで、プロパティ名に式を使用できる
• Method properties
– オブジェクトのメンバーに関数を指定するのが楽になった
let a ='Hello';
const b = 'World';
const c = {a, b}; // {a: Hello, b: World}
const d = {[a]: a}; // {Hello: Hello}
const f = {
method() {}
};
ES.nextな部分を試してみる:
デストラクチャリング
• 配列やオブジェクトの中身を変数に展開
するのがとても楽に
• オブジェクトも配列も展開可能
const fullName =
{firstName: 'Shumpei', lastName: 'Shiraishi'};
// Destructuring
const {firstName, lastName} = fullName;
const array = [firstName, lastName];
// Destructuring
const [first, last] = array;
ES.nextな部分を試してみる:
関数1
• アロー関数
– ( ) => { 関数本体 } という形式で関数定義可能
– 関数本体が単一の式な場合、中括弧を省略可能
• デフォルト引数
– 関数の仮引数に「= デフォルト値」と指定することで、
引数のデフォルト値を指定可能
const sum = (a = 0, b = 0) => { return a + b; };
// 上と同義
// const sum = (a = 0, b = 0) => a + b;
ES.nextな部分を試してみる:
関数2
• Rest Parameter
– 関数の最後の仮引数を「...仮引数名」とすること
で、可変長引数を配列として扱うことが可能
• Spread Operator
– 「...配列」とすることで、配列を関数の引数に展
開できる
// 可変長引数を取る関数
const join = (s, ...rest) => [s, ...rest].join(' ');
let s = ['Wor', 'ld'];
// 配列を引数に展開
join('Hello,', ...s);
ES.nextな部分を試してみる:
クラス
• クラス定義
• コンストラクタ
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
ES.nextな部分を試してみる:
クラス
• 継承
– 親クラスのメンバーを引き継いだ新たなクラ
スを作れる
...(略)...
class MorningGreeter extends Greeter {
greet() {
return "Good morning, " + this.greeting;
}
}
ES.nextな部分を試してみる:
async/await
• Promiseベースの非同期なコードを、あたかも同期的なコードであるかのように記述できるようになる
– 処理は依然として非同期なので、並列度が下がることもない
– 一度使うとやめられないくらい便利。
• asyncキーワードは関数に指定する。
– 指定した関数内ではawaitを使える
– async関数の戻り値はPromiseとなる
• awaitキーワードは、Promiseを返す関数呼び出しの前に付与する
– Promiseを返す関数の結果を戻り値として受け取れる。
– エラーをtry-catchできる。
• TypeScriptのコンパイルターゲットをES6にしないと使えない(Promiseやyieldが必要なので)
// 指定したミリ秒待つ関数
function waitFor(millis): Promise<void> {
return new Promise(resolve => setTimeout(resolve, millis));
}
// 非同期関数
async function hello(seconds) {
try {
// awaitで、Promiseの終了を待ち合わせ
await waitFor(seconds * 1000);
alert('Hello');
} catch (e) {}
}
hello(3); // 3秒後に「Hello」が表示される
型+αを試してみる
• 型定義、型推論、ダックタイピング
• ジェネリクス
• クラス
• 抽象クラス
• インターフェース
• Enum(列挙型)
型+αを試してみる:
型定義、型推論、ダックタイピング
• 「変数名: 変数の型」という記述で変数の型
を明示的に指定可能
• 型を明示的に指定しない場合も、右辺から型
推論される。
• 型のORも可能(型Aもしくは型B)
let a: string ='Hello'; // 型を明示的に指定
const b = 'World'; // 型推論
b = 1; // 型が合わないためエラー
// 文字列もしくは数値型
let c: string | number = 'Hello';
c = 1; // 数値も代入可能
型+αを試してみる:
型定義、型推論、ダックタイピング
• 無名の型を簡単に宣言できる
• ダックタイピング
– 「もしもそれがアヒルのように歩き、アヒルのように鳴く
のなら、それはアヒルである」
– 宣言された型とは無関係のオブジェクトでも、インター
フェースが一致していれば同じ型だとみなされる
// 無名の型をアドホックに宣言
function hello(person: {name: string}): void {
alert(`Hello, ${person.name}`);
}
// 上の型と一致するオブジェクトを引数に指定
hello({name: 'shiraishi'});
型+αを試してみる:
ジェネリクス
• 型情報の一部をパラメータ化する機能
• 例えば、配列内容の具体的な型は、コー
ディング時に初めて決定する
// 文字列型の配列を宣言
let a: Array<string> = [];
// 配列については、以下のようにも指定可能
// let a: string[] = [];
a = 1; // 型が合わないためエラー
// 右辺の型から、型推論も行われる
let b = [1, 2, 3]; // numberの配列と推論される
b = 'a';
型+αを試してみる:
クラス
• アクセス修飾子
– private: そのクラス内でのみ利用可能
– protected: そのクラス、もしくは子クラスから利用可能
– public: あらゆる場所から利用可能
• コンストラクタでのプロパティ指定
– コンストラクタの仮引数に、アクセス修飾子をつけると、
クラスのプロパティ宣言を省略できる
class Greeter {
constructor(private greeting: string) {
}
greet() {
return "Hello, " + this.greeting;
}
}
型+αを試してみる:
抽象クラス
• abstractキーワードをクラスに指定すると抽象クラス
となる。
– 抽象クラスはnewできない
– 抽象クラスには抽象メソッド(中身なしのメソッド)を定
義できる
• 抽象クラスを継承するクラスは、抽象メソッドの実装
が求められる
abstract class Greeter {
constructor(private greeting: string) {
}
abstract greet();
}
// 抽象メソッドを実装していないのでエラー
class MorningGreeter extends Greeter {}
型+αを試してみる:
インターフェース
• interfaceキーワードを使用すると、インターフェース
を定義できる
• インターフェースは全てのメソッドが抽象メソッドと
なる
• implementsキーワードでインターフェースを実装する
クラスを作成可能
– 継承とは異なり、複数のインターフェースを実装可能
interface Greeter {
greet();
}
// 抽象メソッドを実装していないのでエラー
class MorningGreeter implements Greeter {}
型を試してみる:
Enum(列挙型)
• ひとまとまりの定数を型としてまとめら
れる機能
• Enumとは異なるが、代入可能な文字列を
型として定義する機能もある
// 0から始まる定数が割り振られる
enum RGB {RED, GREEN, YELLOW};
// 定数値を指定することも可能
// enum RGB {RED = 1, GREEN, YELLOW};
const color: RGB = RGB.RED;
// red/blue/yellowに限定した文字列型
let s: 'red' | 'blue' | 'yellow';
s = 'black';
TypeScriptを仕事で使う
TypeScriptを仕事で使う
• 仕事で使う、とは?
– 毎日書く→良いエディタが必要
– 複数人で書く→コーディングスタイルの統一
が必要
– コードが大規模→モジュール型開発
– 可能な限り自動化する→ビルドの自動化
TypeScriptを書くためのエディタ
エディタ 良い点(主観) 悪い点(主観)
Visual Studio Code そつなし 設定がJSON
WebStorm 多機能 重い
Atom そつなし
設定がGUI
ファイル検索・イン
デックスが重い
Sublime Text
(あんまり使ってない)
そつなし 設定がJSON
コーディングスタイルの統一
• tslintをつかおう
– コーディングスタイルについてかなり細かい
レベルまで設定可能
• ESLintには敵わないが
モジュール型開発
• モジュール構文(import/export)を使用
– TypeScriptは、モジュール構文を様々なスタ
イルのJavaScriptコードに変換可能
• モジュール分割すると、それをまとめ上
げる必要も生じる
– →モジュールバンドラー必須
モジュールバンドラー
• モジュールバンドラーで、import/exportを
JSコードに変換
import {Component} from 'angular2/core'
↓ (TypeScriptコンパイラ)
var Component = require('angular2/core').Component;
↓ (モジュールバンドラーがrequireをブラウザ上で使えるよう変
換)
var component_1 = __webpack_require__(1);
モジュールバンドラー
• TechFeedではWebpackを選択
– 実績豊富
– React界隈でのデファクト
– なんでもできそう
– 既に下調べが済んでいた
• その他の選択肢について
– Browserify…最古参
– System.js
• 現在のところAngular2公式?
• 後発なため情報が少なめ
• JSPMも組み合わせる必要あり?
• 参考文献
– http://webpack.github.io/docs/comparison.html
– http://ilikekillnerds.com/2015/07/jspm-vs-webpack/
ビルドの自動化
• コード修正→再ビルド→(ビルド終了を
待って)ブラウザリロードを自動化する
必要がある
• TechFeedではgulp+Webpackを組み合わ
せ
– Webpackは超多機能だが、gulpで書くほうが
楽なことも多数
初公開!TechFeedのビルド環境
• Angular2
• Ionic
• gulp
• Webpack
• (Cordova)
TypeScriptの
メリット・デメリット
TypeScriptのメリット
• 最新の言語仕様を思う存分使える
• 静的型付け言語である
– コンパイラによるコードの静的解析
– コードがより文書的
– ツールによるコーディング補助
• 入力補完
• リファクタリング
TypeScriptのデメリット
• ツールチェインがまだ未成熟
– WebStormといえどもまだまだ
• JavaScriptコードとの統合はやはりつらい
– 基本的には型定義ファイル(d.ts)必要
– JSとTSの間には浅くない溝がある
– なので、プロジェクトの一部をTSで…というのは厳
しい
• 静的型付け言語である
– 記述が冗長になりがち
– JSほど気楽に書き下させない
– ビルドが速くない(これはBabelでも同じだが…)
まとめ
TypeScriptはよい言語だがちとつらい

More Related Content

PDF
Pesca montaje moscas 150 fichas paso a paso trucha salmon
PDF
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
PDF
Amplify Studioを使ってみた
PDF
RailsでReact.jsを動かしてみた話
PDF
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
PDF
Laravel × レイヤードアーキテクチャを実践して得られた知見と反省 / Practice of Laravel with layered archi...
PDF
AWS SDK for Android and iOS
PPTX
[GPG스터디] 1.0 데이터 주도적 설계의 마법
Pesca montaje moscas 150 fichas paso a paso trucha salmon
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
Amplify Studioを使ってみた
RailsでReact.jsを動かしてみた話
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
Laravel × レイヤードアーキテクチャを実践して得られた知見と反省 / Practice of Laravel with layered archi...
AWS SDK for Android and iOS
[GPG스터디] 1.0 데이터 주도적 설계의 마법

What's hot (7)

PDF
ウェブアプリケーションセキュリティ超入門
PDF
SQLインジェクション総”習”編
PPTX
ReactiveProperty
PDF
.NET最先端技術によるハイパフォーマンスウェブアプリケーション
PDF
JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」
PPTX
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
PDF
놀면 뭐하니? 같이 개인 방송 서비스 만들어보자! - 김승준 현륜식 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021
ウェブアプリケーションセキュリティ超入門
SQLインジェクション総”習”編
ReactiveProperty
.NET最先端技術によるハイパフォーマンスウェブアプリケーション
JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」
サンプルアプリケーションで学ぶApache Cassandraを使ったJavaアプリケーションの作り方
놀면 뭐하니? 같이 개인 방송 서비스 만들어보자! - 김승준 현륜식 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021

Viewers also liked (20)

PPTX
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
PDF
TypeScript超入門
PDF
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
PDF
TypeScriptは明日から使うべき
PDF
3日時間をもらったのでTypeScriptを触ってみた
PPTX
TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門
PPTX
jQuery+TypeScriptやってみた
PDF
nioで作ったBufferedWriterに変えたら例外になった
PPTX
Javascriptの歴史
PPTX
Let’s angular js!!
PPTX
JavaScriptの仕組みと未来のJavaScript ~ESNextとは~
PDF
React+TypeScriptもいいぞ
PPTX
Workshop1-01
PDF
HTML5を使うためのプログレッシブエンハンスメント 〜すべての人に確実に情報を届けるために〜SwapSkillsFreeEventProgressiv...
PPTX
最近のHTML5はどうなってるのか
PDF
最近のWeb関連技術の動向あれこれ
PDF
モバイルWebアプリのこれまでとこれから。Sencha Touch vs jQuery Mobile
PDF
Ionicでハイブリッドアプリ入門①
PDF
Sencha のフレームワーク Ext JS 5 について 15 分で説明するよ
PDF
今からハジメるHTML5プログラミング
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
TypeScript超入門
はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら!
TypeScriptは明日から使うべき
3日時間をもらったのでTypeScriptを触ってみた
TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門
jQuery+TypeScriptやってみた
nioで作ったBufferedWriterに変えたら例外になった
Javascriptの歴史
Let’s angular js!!
JavaScriptの仕組みと未来のJavaScript ~ESNextとは~
React+TypeScriptもいいぞ
Workshop1-01
HTML5を使うためのプログレッシブエンハンスメント 〜すべての人に確実に情報を届けるために〜SwapSkillsFreeEventProgressiv...
最近のHTML5はどうなってるのか
最近のWeb関連技術の動向あれこれ
モバイルWebアプリのこれまでとこれから。Sencha Touch vs jQuery Mobile
Ionicでハイブリッドアプリ入門①
Sencha のフレームワーク Ext JS 5 について 15 分で説明するよ
今からハジメるHTML5プログラミング

Similar to JavaScript使いのためのTypeScript実践入門 (20)

PDF
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
PDF
TypeScript 1.0 オーバービュー
PDF
TypeScript & 関数型講座 第2回 TypeScript という言語
PDF
TypeScript 言語処理系ことはじめ
PDF
ng-japan 2015 TypeScript+AngularJS 1.3
PDF
TypeScript で型を上手く使う試み.pdf
PDF
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
PDF
LT駆動開発04 5分では分からないTypeScriptのなんとか
PDF
DEV-011_TypeScript ~Any browser. Any host. Any OS. Open Source~
PDF
JSX / Haxe / TypeScript
PDF
TypeScript と Visual Studio Code
PPTX
JavaScriptを使った開発を始めるなら!TypeScriptをはじめよう ~ ステップアップ
PPTX
TypeScriptをオススメする理由
PDF
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
PDF
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
PDF
ECMAScript 6 Features(PDF 版)
PDF
"今" 押さえておきたい! Web アプリ開発の技術トレンドとツールの進化
PDF
Angular ユーザーなら押さえておきたい! TypeScript と Visual Studio Code の基礎と活用
PPTX
大人のお型付け
PDF
TypeScriptへの入口
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
TypeScript 1.0 オーバービュー
TypeScript & 関数型講座 第2回 TypeScript という言語
TypeScript 言語処理系ことはじめ
ng-japan 2015 TypeScript+AngularJS 1.3
TypeScript で型を上手く使う試み.pdf
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
LT駆動開発04 5分では分からないTypeScriptのなんとか
DEV-011_TypeScript ~Any browser. Any host. Any OS. Open Source~
JSX / Haxe / TypeScript
TypeScript と Visual Studio Code
JavaScriptを使った開発を始めるなら!TypeScriptをはじめよう ~ ステップアップ
TypeScriptをオススメする理由
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
ECMAScript 6 Features(PDF 版)
"今" 押さえておきたい! Web アプリ開発の技術トレンドとツールの進化
Angular ユーザーなら押さえておきたい! TypeScript と Visual Studio Code の基礎と活用
大人のお型付け
TypeScriptへの入口

More from Shumpei Shiraishi (20)

PDF
俺的GEB概論(前半)
PPTX
コンセプトのつくりかた - アイデアをかたちにする技術
PPTX
「それでも人生にイエスと言う」を読んで
PPTX
「それでも人生にイエスと言う」を読んで
PPTX
Angular2実践入門
PDF
WebRTCがビデオ会議市場に与えるインパクトを探る
PDF
変身×フランツ・カフカ
PPTX
イラスト日用服飾辞典/三面記事の歴史/健康男 を読んで
PPTX
「1秒でわかる!アパレル業界ハンドブック」を読んで
PPTX
漫☆画太郎論
PPTX
HTML5時代のフロントエンド開発入門
PPTX
6,000人のWeb技術者コミュニティを5年間やってみて学んだこと
PPTX
はじめにことばありき
PPTX
秒速一億円
PPTX
HTML5がもたらすアプリ開発へのインパクト
PPTX
この人と結婚していいの?を読んで
PPT
20130921レジュメ2
PPTX
第62回 読書するエンジニアの会(テーマ:メカ) 「Prototyping lab」
PPTX
はやぶさ」からの贈り物
PDF
第1回 (白石俊平と) カッコいいやつら
俺的GEB概論(前半)
コンセプトのつくりかた - アイデアをかたちにする技術
「それでも人生にイエスと言う」を読んで
「それでも人生にイエスと言う」を読んで
Angular2実践入門
WebRTCがビデオ会議市場に与えるインパクトを探る
変身×フランツ・カフカ
イラスト日用服飾辞典/三面記事の歴史/健康男 を読んで
「1秒でわかる!アパレル業界ハンドブック」を読んで
漫☆画太郎論
HTML5時代のフロントエンド開発入門
6,000人のWeb技術者コミュニティを5年間やってみて学んだこと
はじめにことばありき
秒速一億円
HTML5がもたらすアプリ開発へのインパクト
この人と結婚していいの?を読んで
20130921レジュメ2
第62回 読書するエンジニアの会(テーマ:メカ) 「Prototyping lab」
はやぶさ」からの贈り物
第1回 (白石俊平と) カッコいいやつら

JavaScript使いのためのTypeScript実践入門