Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
挑戦! TypeScript
Search
oracle4engineer
PRO
April 06, 2022
Technology
880
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
挑戦! TypeScript
oracle4engineer
PRO
April 06, 2022
More Decks by oracle4engineer
See All by oracle4engineer
Oracle Exadata Database Service on Cloud@Customer X11M (ExaDB-C@C) サービス概要
oracle4engineer
PRO
2
8.3k
Deep Data Security 機能解説
oracle4engineer
PRO
2
260
Oracle Cloud Infrastructure:2026年6月度サービス・アップデート
oracle4engineer
PRO
1
500
Oracle AI Databaseデータベース・サービスのメンテナンス(BaseDB/ExaDB-D/ExaDB-XS)
oracle4engineer
PRO
4
1.8k
Oracle AI Database@Google Cloud:サービス概要のご紹介
oracle4engineer
PRO
6
1.6k
Oracle AI Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
6
2.1k
Oracle AI Database@AWS:サービス概要のご紹介
oracle4engineer
PRO
4
3.1k
CrossplaneによるCloud Native Control Plane
oracle4engineer
PRO
0
120
OCI Oracle AI Database Services新機能アップデート(2026/03-2026/05)
oracle4engineer
PRO
1
640
Other Decks in Technology
See All in Technology
インフラ寄りSREでも 開発に踏み出せる〜境界を越えてユーザー体験に向き合いたい〜
sansantech
PRO
0
290
トークン最適化のためのユーザーストーリー分析 / User Story Analysis for Token Optimization
oomatomo
0
170
フルAIで個人開発して学んだあれこれ / yuruai vol.1
isaoshimizu
0
170
攻撃者がいなくてもAIエージェントはインシデントを起こす
nomizone
0
200
AIDLC_ヤフーショッピングの取り組み
lycorptech_jp
PRO
0
520
どうして今サーバーサイドKotlinを選択したのか
nealle
0
190
そのハーネス、本当に境界になっていますか? AIエージェント時代の実行環境設計【MEGU-Meet #4】
cscengineer
PRO
0
110
SRE依存からの脱却 運用を開 発チームへ移す、 フルサイ クル開 発体制の実践
joooee0000
0
160
AWS Blocks を触ってみた/first-tach-aws-blocks
fossamagna
2
140
“全部コピーしない”ファイルデータの活用 : — FSx for ONTAP × S3 Tables × Icebergで作るメタデータカタログ
yoshiki0705
0
410
事業価値を⽣み出すSREへ SREが担うべき意思決定の5層
kenta_hi
0
150
組織における AI-DLC 実践
askul
0
300
Featured
See All Featured
Done Done
chrislema
186
16k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Practical Orchestrator
shlominoach
191
11k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
760
Discover your Explorer Soul
emna__ayadi
2
1.2k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
Technical Leadership for Architectural Decision Making
baasie
3
430
Building an army of robots
kneath
306
46k
Abbi's Birthday
coloredviolet
3
8.5k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
460
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
270
Transcript
挑戦!TypeScript OCHaCafe5 #4 Kyotaro Nonaka Oracle Corporation Japan Apr. 6,
2022
はじめに – 本日のコンセプト 「TypeScript?名前は知ってるけど使ったことはないなぁ」という人でも、 TypeScriptの特長を知り、 TypeScriptを使ったフロントエンド開発ができるように! 2 Copyright © 2022,
Oracle and/or its affiliates
Agenda 1. TypeScriptとは? 2. TypeScript開発を始めよう – TypeScriptプロジェクトを用いた開発 3. TypeScript開発を始めよう –
型指定や機能の確認 4. TypeScriptで実際に画面を作ってよう 3 Copyright © 2022, Oracle and/or its affiliates
自己紹介 • 野中 恭大郎 • 日本オラクル ソリューションアーキテクト本部 • 前職はECパッケージのアプリエンジニア •
OCHaCafe出場7回目 • 巨人もリバプールも調子よくてスポーツ観戦が楽しいです 4 Copyright © 2022, Oracle and/or its affiliates @non_kyon
TypeScriptとは? 5 Copyright © 2022, Oracle and/or its affiliates
TypeScriptとは? 一言で言えば、型定義のできるJavaScript • JavaScriptの拡張 • JavaScriptとの互換性 • Microsoftが開発/メンテナンス 利用事例 •
Google, Slack, など既に多くの企業が利用 TypeScriptを利用できるフレームワーク • React • Vue.js • Angular など 6 Copyright © 2022, Oracle and/or its affiliates
TypeScript? JavaScript? その関係 TypeScriptは、 • JavaScriptの上位互換 • JavaScriptの標準仕様である ECMAScriptに準拠 •
コンパイルしてJSになる(=Node.js) なので、関係性は右図のように • 因みに、ES6とはECMAScript2015の ことを指す 7 Copyright © 2022, Oracle and/or its affiliates
Why TypeScript ? 型の追加 • 可読性の向上 • 保守性の向上 • 開発生産性の向上
コンパイラ • CI/CDとの親和性 • ES5/ES6の互換性 言語特性 • 標準仕様に準拠 • JavaScriptの知識をそのまま活かせる 8 Copyright © 2022, Oracle and/or its affiliates JavaScriptでは動かすまでtypoに気づけない TS化 エラーが出るのでtypoに気づける(IDEの補完機能も使える) ⇒ 生産性の向上 どんな値が入り得るのかわからない(わかりづらい) TS化 どんな値が入るのかが分かる ⇒ 可読性の向上、保守性の向上 ▪型の追加によるメリットのイメージ
TypeScriptで開発する = JavaScriptで開発する TypeScriptは概念的に、JavaScriptにリンターとドキュメントを加えたもの • JavaScriptを記述してプログラミング • 型によってJavaScriptを静的に解析し、バグや潜在的なバグを減らす(リンターの導入) • 型によってJavaScriptの可読性を向上(ソースコードそのもののドキュメント化)
9 Copyright © 2022, Oracle and/or its affiliates JavaScriptを学べば、TypeScriptは書ける!
TypeScriptの「型」システム TypeScriptは、型を追加することで、 リンターのメリットやドキュメントのメリットをJavaScriptに組み込むことを可能とする 型という概念の導入障壁もできるだけ低くなるように設計されている • 型推論 • 型指定 • 構造的な型システム
10 Copyright © 2022, Oracle and/or its affiliates
暗黙的な型推論 TypeScriptは、可能な限り型推論を行う 例えば、特に大きなプロジェクトで、ある変数が stringなのかnumberなのか、などの可読性 の問題を解決 また、エラーは発生するものの、JavaScript自 体は元のまま出力されるので、段階的な移行 を実現できる 11 Copyright
© 2022, Oracle and/or its affiliates var foo = 123; //number(数値)を代入 foo = ‘456’; // stringを代入しようとするとエラー
明示的な型指定(TypeAnnotation) 明示的に型を指定 (TypeAnnotationの記述)が可能 明示的に型を指定することで • コード自体がドキュメントになる • コンパイラに対して型の解釈を強制する 12 Copyright
© 2022, Oracle and/or its affiliates var foo: number = 123; //コロンで型指定 foo = ‘456’; // stringを代入しようとするとエラー
構造的型システム 端的に言えば、「オブジェクトの構造が同じであれば、型に 互換性がある」ということ 追加のプロパティがあっても互換性は保たれる ※構造的型について非常にわかりやすくまとめてくださっています https://qiita.com/suin/items/52cf80021361168f6b0e 13 Copyright © 2022,
Oracle and/or its affiliates
TypeScript開発を始めよう TypeScriptプロジェクトを用いた開発 14 Copyright © 2022, Oracle and/or its affiliates
TypeScriptプロジェクトの全体像 プロジェクトルート/ │ ├ src/ │ ├ node_modules │ │
│ ├ js/ │ └ ts/ │ │ ├ dist/ │ └ tsconfig.json 15 Copyright © 2022, Oracle and/or its affiliates プロジェクトの管理単位 JavaScriptのソースを配置 TypeScriptのソースを配置 コンパイル成果物の置き場 tscによるコンパイル コンパイルコンテキスト ├ node_modules └ ts/ │… ├ example1.ts │ ├ example2.ts │ ├ example3.ts │… グローバル名前空間を利用 した変数や関数の共有 3rdパーティライブラリなど impor/exportによる、 異なるTSファイル間にお ける変数や関数のやりとり
compilation context (コンパイルコンテキスト) TypeScriptでは、tsconfig.jsonファイルを用いて、コンパイル対象のファイル情報(include/exclude)やコ ンパイラオプションを設定する 16 Copyright © 2022, Oracle
and/or its affiliates ▪ tsconfig.jsonの作成 • 空のJSONファイルの作成 • tsc init コマンドの実行 {} $ tsc --init ▪ コンパイラオプション https://www.typescriptlang.org/ tsconfig#compilerOptions { "compilerOptions": { "target": "es5", "module": "commonjs", "lib": [], … } } ▪ include/exclude **/*で「全てのフォルダとファイル」を意味(glob) { "compilerOptions": … "include":[ "./folder" ], "exclude":[ "./folder/**/*.spec.ts", "./folder/someSubFolder" ] }
TypeScriptコンパイラ(tsc) インストール コンパイルの実行(親ディレクトリ含め、tsconfig.jsonが検索される) プロジェクトのディレクトリを指定 watchモードで起動 • TypeScriptプロジェクトファイルの変更を監視 • 変更があれば再コンパイルするので、変更分がすぐに確認できる 17
Copyright © 2022, Oracle and/or its affiliates $ npm install -g typescript //node.jsのインストールが必要 $ tsc $ tsc -p ./<対象のプロジェクトディレクトリ> $ tsc -w
Modules (モジュール) – グローバル名前空間 単純に変数宣言だけを行うと 他の.tsファイルで変数が利用できる 18 Copyright © 2022,
Oracle and/or its affiliates 競合しやすくなるので 注意が必要
Modules (モジュール) – モジュールの仕様 exportを利用 exportを付けると エラーが出るように importを利用 importすることでexportした変数が利用できる importした変数に再代入は不可
19 Copyright © 2022, Oracle and/or its affiliates
Dynamic Import Expressions (動的インポート) インポートは動的(且つ非同期)に行うことも可能 初期表示のパフォーマンス改善などに役立つ 20 Copyright © 2022,
Oracle and/or its affiliates ※古いブラウザ(IEなど)では利用できないこともあるので注意
TypeScript開発を始めよう 型指定や機能の確認 21 Copyright © 2022, Oracle and/or its affiliates
: TypeAnnotation で型指定 基本的な型 • class/interface/type • プリミティブ型 • 配列
• インターフェース • インライン型 特殊な型 • any • null/undefined • void その他 ジェネリクス Union Intersection Tuple Alias 22 Copyright © 2022, Oracle and/or its affiliates
: TypeAnnotation で型指定 基本的な型 プリミティブ型 以下の3つを意味 • string • number
• boolean 配列 number[]のように、型の 後に[]を付ける インターフェース 複数の型指定を単一のも のにまとめる ※後ほど詳しく解説 インライン型 名前を持たないインター フェース(可読性の観点から、 極力使うべきではない) 23 Copyright © 2022, Oracle and/or its affiliates
: TypeAnnotation で型指定 基本的な型 class • 他言語のClassと同様の用途 • newでインスタンス作成が可能 •
コンストラクタの定義が可能 • getter/setterを使った変数ア クセスの制御も可能 interface • 複数の型アノテーションをまとめる 用途で利用 • 変数などの型指定に用いられる • インスタンス作成ができない • implementsでClassの実装が 可能 type interfaceと同様に複数の型アノ テーションをまとめる用途 型指定に利用でき、下図”Pet”のよ うにenumのような使い方もできる 24 Copyright © 2022, Oracle and/or its affiliates
: TypeAnnotation で型指定 特殊な型 any 名前の通り、全ての型を許容する JavaScriptからの移行などで利用す る場合が考えられる null /
undefined 正確には型ではない(≒型として指定 することはない)が、TS/JSでは存在 しない値としてnullとundefinedがあ る void 関数の戻り値がない場合にvoidを 指定 25 Copyright © 2022, Oracle and/or its affiliates
: TypeAnnotation で型指定 その他 ジェネリクス Javaなどと同様に、実行時 に型が決まる場合に利用が できる Union いくつかの決まった型のうちど
れか、という表現が可能 Intersection &で繋ぐことによって、型と型 を併せた型として定義するこ とができる Tuple 配列的に型を指定すること ができる 26 Copyright © 2022, Oracle and/or its affiliates
Namespaces (ネームスペース) Namespaceを利用して、コード内部をグループ化して利用できる 基本的にはModulesの機能を使うべきだが、ファイルを切り出したりなどの必要がないため、 既存JavaScriptのTypeScript移行などに利用すると便利 27 Copyright © 2022, Oracle
and/or its affiliates コンパ イル 実行
@types パッケージ (Definitely Typed) @typesとは? • TypeScript用の型定義リポジトリ • JSライブラリなどを型定義済みで使えるように •
パッケージの検索 • https://www.typescriptlang.org/dt/search @typesの使い方 • npmを用いて@typesパッケージをインストールすれば、グローバルに利用できる • 例: Reactのライブラリをインストール • 一般的には、ソースコード内でモジュールのように利用する 28 Copyright © 2022, Oracle and/or its affiliates npm install --save-dev @types/react import * as React from 'react';
アンビエント宣言(declare) アンビエント宣言(declare)を利用すると、 • 他のコンポーネントに型の情報を付加できる • 既存のJavaScriptライブラリを型安全に利用可能 • @typesパッケージもこのアンビエント宣言を利用 lib.d.ts •
JSランタイムやDOMにある、一般的なJavaScriptの 機能のアンビエント宣言をまとめた型定義ファイル • TypeScriptをインストールすれば自動的に使える 29 Copyright © 2022, Oracle and/or its affiliates ▪example.d.ts ▪元の.tsファイル ※ *.d.tsの形で型定義のファイル は分けるのが一般的
型アサーション TypeScriptにはオブジェクトを任意の型で上書きする型 アサーションという機能がある このエラーは、exampleが「何もフィールドを持たない型」 とコンパイラが型推論を行っているので発生する 以下のように、interfaceを定義して as を使う <>を利用することもできる ※キャストとの違い
ソースコードの記述という観点では同じように扱うが、 • 実行時の型を強制するキャスト • 型をどのように解釈するかをコンパイラに伝えるアサー ション と言った違いがある 30 Copyright © 2022, Oracle and/or its affiliates
Enum TypeScriptではEnumが利用できる 下図のように記述した場合、内部的にはnumberとして 扱われる String型のEnumも記述可能 constを付けるとパフォーマンス的にメリットがある 31 Copyright © 2022,
Oracle and/or its affiliates
関数における型 パラメータに型指定 ?を付けてオプションパラメータ化 関数の型のみを定義 32 Copyright © 2022, Oracle and/or
its affiliates
型ガード typeof • typeof演算子を利用すると、異なるブロック内で異 なる型の形で解釈できる • 下図はnumberとstringのそれぞれで存在しないメ ソッドに対してエラーが出ている instanceof •
instanceof演算子もtypeofと同様 • 下図は、異なるClass(=instance)のそれぞれで存 在しないフィールドに対してエラーが出ている 33 Copyright © 2022, Oracle and/or its affiliates
TypeScriptで実際に画面を作ってみよう 34 Copyright © 2022, Oracle and/or its affiliates
デモ: TypeScriptでDOM操作 Blank状態のHTML + JavaScriptで文字表示 35 Copyright © 2022, Oracle
and/or its affiliates <div id=“app”>要素に<h1>要素がappendされる ▪demo-simpledom.htmlをブラウザで表示 これを元に 1. index.tsの記述 2. js/index.jsにコンパイル 3. メッセージをHello, TypeScript!に置き換える と言った流れのデモを行う index.js(この時点では存在しない)を読み込む
実際に記述する…その前にプロジェクトの構成 • $ tsc --initの実行 • tsconfig.jsonを自動的に生成 • tsconfig.json内、outDirのコメントアウトを外し、コンパイル成果物(JS)の配置先を 指定
• index.tsを作成 • 中身はHTML内のJSのまま • ここでまず $ tsc を実行してみる • js/以下にindex.jsが出力されれば、プロジェクトの構成は上手くいっていることになる 36 Copyright © 2022, Oracle and/or its affiliates
型アノテーションを用いてindex.tsを記述 ▪index.ts 37 Copyright © 2022, Oracle and/or its affiliates
.tsのコンパイル • $ tscをプロジェクトのルートディレクトリで実行 • 成果物のJSを確認してみる • HTMLページをブラウザで開いてみる 38 Copyright
© 2022, Oracle and/or its affiliates
TypeScriptでWebページを作ってみる TypeScriptを使ったWeb アプリを作成 • SPA(Single Page Application) • Oracleが提供するフロン トエンドフレームワーク
(ツールキット)Oracle JETを利用 • フレームワークを利用した 場合のプロジェクト構造 やTypeScripソースの構 造を確認してみる 39 Copyright © 2022, Oracle and/or its affiliates
Oracle JET (JavaScript Extension Toolkit) クラウド・ネイティブなエンタープライズ・システムのための JavaScript ツールキット オープンソース・プロジェクトにオラクルがエンタープライズ開発に必要な 要素を追加
• Oracle JET を構成するオープンソース・プロジェクト • オラクルが追加した要素 • 双方向データ・バインディングのための共通データ・モデルAPI、i18n/L10N、 アクセシビリティ、データ検証/変換、データ可視化UI レスポンシブ Web アプリとハイブリッド・モバイル・アプリの両方に対応 オープンソース (Universal Permissive License) で利用可能 TypeScriptに対応 40 Copyright © 2022, Oracle and/or its affiliates Knockout.js RequireJS jQuery jQuery UI Hammer
プロジェクト構造 demo-spa(プロジェクトルート)/ ├ node_modules -> @typesパッケージなどライブラリ群 ├ scripts -> Oracle
JETがビルドなどに利用するライブラリ ├ src/ │ ├ css/ -> CSSファイル群 │ ├ js/ -> JSファイル群(アンビエント宣言を行う独自ライブラリなど) │ └ ts/ -> TSファイル群 ├ index.html -> メインページ ├ staged-themes/ -> Oracle JETがCSSテーマに利用するCSSライブラリ ├ web/ -> ビルド成果物などの配置先(FWによってdistなどの場合もあり) … └ tsconfig.json -> TypeScript設定ファイル 41 Copyright © 2022, Oracle and/or its affiliates FW固有 FW固有
TypeScriptソース 実際に見ながら確認 42 Copyright © 2022, Oracle and/or its affiliates
ご清聴ありがとうございました! 43 Copyright © 2022, Oracle and/or its affiliates