TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

56
型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部 @vvakame

description

http://vshtc.doorkeeper.jp/events/11407

Transcript of TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

Page 1: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

型定義ファイルのある開発TypeScript勉強会 VSハッカソン倶楽部

@vvakame

Page 2: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

わかめ まさひろ

GAE

Android

TypeScript

AngularJS

@v vakame

Page 3: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

• Google App Engine!• Android!• Google Apps!などなど、!

!

!

技術に特化した会社です。!Microsoft?

Page 4: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

宣伝

TypeScriptリファレンス

紙・電子共 好評発売中!

Amazon(紙, Kindle)達人出版会(PDF)

Page 5: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

おさらい:TypeScriptの特長

TypeScriptチートシート

goo.gl/QiXe8t

Page 6: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

TypeScriptの特長• TypeScriptはJavaScriptを拡張した言語!

• 静的型付け!!

• ECMAScript 6規格の文法を先取り☆!

• 読みやすい変換後JavaScript!

• Java, C# とかに優しい言語仕様!• 長いコンパイル時間 最も現実的なaltJSだ!

Page 7: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

TypeScriptといえば…

Page 8: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

静的型付

0

12.5

25

37.5

50

人数

型は必要 型は不要

型は必要!

出典:民明書房 - 激烈!天下一altJS武闘会 - より

Page 9: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

Why needs 型?• 多くのエラーをコンパイル時に!

• 実行時エラーはもううんざり!!• 間違った使い方は不可能に!

• リファクタリングも安心確実!!• コンパイルが通ればある程度動く!!

• IDEなどのサポートが得られやすい

JS完全互換!

Page 10: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

TypeScriptでの型

• primitive type 御三家!

• number!• string!• boolean

JS完全互換!

Page 11: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

TypeScriptでの型

• 忘れちゃならない!

• any!• void

JS完全互換!

Page 12: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

TypeScriptでの型• class!

• 実体も型も存在するイケメン!

• interface!• 地味 型しか存在しない!

• object type literal!• ↑TypeScriptリファレンス参照!

• 雑に説明すると即興interfacemodule君も一応いる

Page 13: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

TypeScriptでの型

• ECMAScriptにいるやつ!

• DateとかArrayとかFunctionとか!• ブラウザにいるやつ!

• windowとかDOM系のやつとか↑結局classかinterface

Page 14: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

TypeScript & JavaScript

• JSのライブラリが使いたい!!

• jQuery!• AngularJS!• mocha!• etc…!

• お任せください!

@Neri78さんの 解説を思い出そう!

Page 15: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

DefinitelyTyped

definitely/déf(ə)nətli/ →define 副詞more ~; most ~ 2 明確に, はっきりと〈断る述べる決めるなど〉.

type/taɪp/ 〖語源は「打ってできた形型」〗 (形)typical, (副)typically 名詞複~s/-s/ 1 C(ある特性を共有する)型, タイプ, 類型; 種類(kind2, sort)

ウィズダム英和辞典より

I’m committer!

definitelytyped.orggithub.com/borisyankov/DefinitelyTyped

Page 16: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

型定義ファイル .d.ts

Over 450!

Page 17: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

interface Moment { ! format(format: string): string; format(): string; ! fromNow(withoutSuffix?: boolean): string; ! startOf(soort: string): Moment; endOf(soort: string): Moment; ! add(input: MomentInput): Moment; add(soort: string, aantal: number): Moment; add(duration: Duration): Moment; subtract(input: MomentInput): Moment; subtract(soort: string, aantal: number): Moment; ! calendar(): string; clone(): Moment; ! valueOf(): number; ! local(): Moment; // current date/time in local mode ! utc(): Moment; // current date/time in UTC mode ! isValid(): boolean;

既存JSに型を後付けするhttp://momentjs.com/

goo.gl/9QnuC3

Page 18: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

型定義ファイルの探し方

Page 19: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

DefinitelyTypedで探す• github.com/borisyankov/DefinitelyTyped!

• GitHub!• t キーで頑張る!

• tsd!• definitelytyped.org/tsd/!

• NuGet!• www.nuget.org/packages?

q=DefinitelyTyped

Page 20: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

世界貢献!

Page 21: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

.d.ts 利用例• FunScript!

• F# to JavaScript!

• Scala.js!

• scala.js ts importer!

• dts-parser!

• TypedCoffeeScript by mizchi

Page 22: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

in Pure JavaScript

• WebStorm (JetBrains社のIDE)!

• 通常のJSコード書きにも使える!!

• JavaScript > Libraries > Download > TypeScript community stubs

Page 23: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

.d.ts = 大統一型定義ファイル

•つよい!!

•すごい!!

•やばい!

Page 24: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

是非• TypeScript固有の事情が入るよね!

• WebIDLとか使ったほうがよくね?!

• しかし、多くの人は今すぐ使いたい!

• DefinitelyTyped、450もあるらしっすよ!

• ↑大正義より良い解が見つかるといいな

Page 25: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

まとめ↓ JavaScriptより強い安全性を求め!

↓ 静的型チェックのない世界殺すマン!

↓ しかし既存JS資産は活用したい…!

↓ 型定義ファイル、必要です!!

↓ それ、DefinitelyTypedにあるよ

Page 26: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

.d.ts 作る?

Page 27: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

Pros/Cons• Pros!

• ライブラリへの理解が深まる!

• 後の安心が手に入る!

• Cons!

• 作業前工数が膨れ上がる!

• 書き方を学習するのが大変みんなはどう思うかな?

Page 28: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

Pros/Cons• Pros!

• ライブラリへの理解が深まる!

• 後の安心が手に入る!

• Cons!

• 作業前工数が膨れ上がる!

• 書き方を学習するのが大変

Page 29: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

作業工数?

弊社 No.2 TypeScripter

Grapswizさんの感想

Page 30: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

作業工数?• ぶっちゃけ趣味プログラミング中ではマジであります。!

• 仕事の場合は最低限使える範囲をパパっとやって、終わりっ!!

• 型定義貯金!

• キッチリやると後々デバッグ時間の削減という形で還元されてくる

Page 31: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

書き方の学習• 基本はTypeScriptを踏襲!

• トップレベルには declare をつける!

• 実装を書けないことに留意!

• モジュールの書き方!

• 内部モジュール!

• 外部モジュール

TypeScript 難易度の頂

Page 32: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

.d.ts 作る!!

Page 33: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

How to write .d.ts?

• 普通にライブラリ使う時と変わらない!

• APIリファレンスを読む!

• 実装を読む!

• 実行してみて確かめる

時間余ったら実演します

Page 34: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

やってはいけない!

• 無駄に凝る

てきとーにやろ

Page 35: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

結論

• コンパイルが通ればいいんだよ!

ただし—noImplicitAny 非対応はギルティ

Page 36: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

向き・不向き• TypeScriptに不向きなライブラリもある!

• 独自のOOPの仕組みを持つもの!

• データ入れるとクラスが返るやつ!

• 主にDBのORマッパが多い!

• Sequelizeの例◯◯言語にある☓☓があれば解決するのに…

という悩み、結構ある

Page 37: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

避けないほうがいい知識• 内部・外部モジュール!

• TypeScriptリファレンス参照!

• teppeisさんのBlog参照!

• www.typescriptlang.org/Handbook!

• 誰か許可とって翻訳してください><!

• Class Decomposition が特に重要

Page 38: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

anyを使う

• とりあえずコンパイル通る!!

• A. まずany、後から詳細化していく!

作れる = 正義!

Page 39: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

anyを使う

• とりあえずコンパイル通る!!

• A. まずany、後から詳細化していく!

• B. 利用側コードに必要なとこ作る

PRはBの方が送りやすいdeclare var $: any; ←流石にコレは困る

Page 40: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

new operator

• new 演算子を使う対象!

• class!

• interface (class decomposition)!

• 具体例!

• goo.gl/qD60Vi

interfaceが主流?

Page 41: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

new operator• 何故クラスを分解するのか?!

• interfaceは後付で拡張できる!

• だいたいJavaScriptのせい!

• Aライブラリを勝手に拡張する

Bライブラリ!

• ↑interfaceじゃないと対応できない

Page 42: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

new operator• interfaceの利点!

• 別ライブラリの拡張に耐える!!

• 具体例 goo.gl/nHMTqu!

• interfaceの欠点!

• 継承できない!!

• 具体例 goo.gl/QOO8yl

用途を考え classの利用を検討

Page 43: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

命名規則• JSの流儀に従う!

• クラス名は先頭大文字 Sample!• モジュール名もかな…!

• 変数、メソッド キャメルケース fooBar!

• インタフェースは先頭I付き ISample!

• ↑賛否両論 ちょとおすすめ ぐらいC#erはメソッド先頭大文字多いですね

それはどうかと思うけど…

Page 44: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

オブジェクト型リテラル

• キッチリ理解すると柔軟な表現が可能!

• これだけで1時間話せるレベル!

• TSチートシート goo.gl/QiXe8t!

• TSリファレンス goo.gl/G9gzeu

Page 45: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

非インスタンス化モジュール• 型定義を作る時の便利なテクニック!!• 具体例 goo.gl/xVNmYD!• わかめの後悔!

• non instantiated module!• 非インスタンス化モジュールと訳した!

• 幽霊モジュール goo.gl/vlQGUF!

• ↑わかりやすい… DTコミッタ

@basarat 命名

Page 46: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

関数とモジュールの定義統合

• 具体例 goo.gl/F7tvg6!

• なんでこんなことできるの?!

• JavaScriptでできるから(たぶん

Page 47: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

オーバーロード

• any, Function, …args: any[] からの脱皮!

• より優れたコンパイル時エラー検出!

• 様々な引数に対応する!

• 文字列リテラルによる特殊化!

• 引数によって異なる型を返す

Page 48: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

pull requestを送ろう!

Page 49: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

作ったものは共有しよう

• 他の人が楽できるぞ!!

• 自分が楽できるのも誰かのおかげ!!

• 誰かが完成させてくれるかも?!

• 誰かがバグ直してくれるかも?

主に下2つが重要

Page 50: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

pull request?

• GitHubにはpull requestがある!

• PRと略されることも!

• fork→commit→push→PR!!

• GitHub実践入門が良書らしい

PR童貞が許されるのは高校生までだよね~w

Page 51: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

具体的に

• Qiitaに解説記事書いた!

• DefinitelyTyped公式解説もある!

• コミッタに日本人がいる→!

• ↑当然日本語が喋れる!

• ちなみに英語は不自由

Page 52: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

ん?• もし、あなたがPR未経験なら…!

• DefinitelyTypedにPRを出そう!!

• たくさんの型定義の集合!

• 全体を把握しなくても追加できる!!

• 1文字だけの修正のPRも大歓迎!

Page 53: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

Live Writing

自分用メモ antigen theme imajes

⌘ Shift + ⌘ Shift 0

Page 54: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

• 適当なライブラリを調べて書く!

• Bacon.js 良さそう!

• その場で選んでもらう?どっちにしよ? 3分で決めよう!

Page 55: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

かもん!しつもん!

Page 56: TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部

だいたい全部書いてある

1時間で喋りきれない事 多すぎんよ~ww

Amazon(紙, Kindle)達人出版会(PDF)