Upgrade to Pro — share decks privately, control downloads, hide ads and more …

挑戦! TypeScript

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

挑戦! TypeScript

Avatar for oracle4engineer

oracle4engineer PRO

April 06, 2022
Tweet

More Decks by oracle4engineer

Other Decks in Technology

Transcript

  1. Agenda 1. TypeScriptとは? 2. TypeScript開発を始めよう – TypeScriptプロジェクトを用いた開発 3. TypeScript開発を始めよう –

    型指定や機能の確認 4. TypeScriptで実際に画面を作ってよう 3 Copyright © 2022, Oracle and/or its affiliates
  2. 自己紹介 • 野中 恭大郎 • 日本オラクル ソリューションアーキテクト本部 • 前職はECパッケージのアプリエンジニア •

    OCHaCafe出場7回目 • 巨人もリバプールも調子よくてスポーツ観戦が楽しいです 4 Copyright © 2022, Oracle and/or its affiliates @non_kyon
  3. TypeScriptとは? 一言で言えば、型定義のできるJavaScript • JavaScriptの拡張 • JavaScriptとの互換性 • Microsoftが開発/メンテナンス 利用事例 •

    Google, Slack, など既に多くの企業が利用 TypeScriptを利用できるフレームワーク • React • Vue.js • Angular など 6 Copyright © 2022, Oracle and/or its affiliates
  4. TypeScript? JavaScript? その関係 TypeScriptは、 • JavaScriptの上位互換 • JavaScriptの標準仕様である ECMAScriptに準拠 •

    コンパイルしてJSになる(=Node.js) なので、関係性は右図のように • 因みに、ES6とはECMAScript2015の ことを指す 7 Copyright © 2022, Oracle and/or its affiliates
  5. Why TypeScript ? 型の追加 • 可読性の向上 • 保守性の向上 • 開発生産性の向上

    コンパイラ • CI/CDとの親和性 • ES5/ES6の互換性 言語特性 • 標準仕様に準拠 • JavaScriptの知識をそのまま活かせる 8 Copyright © 2022, Oracle and/or its affiliates JavaScriptでは動かすまでtypoに気づけない TS化 エラーが出るのでtypoに気づける(IDEの補完機能も使える) ⇒ 生産性の向上 どんな値が入り得るのかわからない(わかりづらい) TS化 どんな値が入るのかが分かる ⇒ 可読性の向上、保守性の向上 ▪型の追加によるメリットのイメージ
  6. 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ファイル間にお ける変数や関数のやりとり
  7. 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" ] }
  8. : TypeAnnotation で型指定 基本的な型 • class/interface/type • プリミティブ型 • 配列

    • インターフェース • インライン型 特殊な型 • any • null/undefined • void その他 ジェネリクス Union Intersection Tuple Alias 22 Copyright © 2022, Oracle and/or its affiliates
  9. : TypeAnnotation で型指定 基本的な型 プリミティブ型 以下の3つを意味 • string • number

    • boolean 配列 number[]のように、型の 後に[]を付ける インターフェース 複数の型指定を単一のも のにまとめる ※後ほど詳しく解説 インライン型 名前を持たないインター フェース(可読性の観点から、 極力使うべきではない) 23 Copyright © 2022, Oracle and/or its affiliates
  10. : TypeAnnotation で型指定 基本的な型 class • 他言語のClassと同様の用途 • newでインスタンス作成が可能 •

    コンストラクタの定義が可能 • getter/setterを使った変数ア クセスの制御も可能 interface • 複数の型アノテーションをまとめる 用途で利用 • 変数などの型指定に用いられる • インスタンス作成ができない • implementsでClassの実装が 可能 type interfaceと同様に複数の型アノ テーションをまとめる用途 型指定に利用でき、下図”Pet”のよ うにenumのような使い方もできる 24 Copyright © 2022, Oracle and/or its affiliates
  11. : TypeAnnotation で型指定 特殊な型 any 名前の通り、全ての型を許容する JavaScriptからの移行などで利用す る場合が考えられる null /

    undefined 正確には型ではない(≒型として指定 することはない)が、TS/JSでは存在 しない値としてnullとundefinedがあ る void 関数の戻り値がない場合にvoidを 指定 25 Copyright © 2022, Oracle and/or its affiliates
  12. : TypeAnnotation で型指定 その他 ジェネリクス Javaなどと同様に、実行時 に型が決まる場合に利用が できる Union いくつかの決まった型のうちど

    れか、という表現が可能 Intersection &で繋ぐことによって、型と型 を併せた型として定義するこ とができる Tuple 配列的に型を指定すること ができる 26 Copyright © 2022, Oracle and/or its affiliates
  13. @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';
  14. アンビエント宣言(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の形で型定義のファイル は分けるのが一般的
  15. 型アサーション TypeScriptにはオブジェクトを任意の型で上書きする型 アサーションという機能がある このエラーは、exampleが「何もフィールドを持たない型」 とコンパイラが型推論を行っているので発生する 以下のように、interfaceを定義して as を使う <>を利用することもできる ※キャストとの違い

    ソースコードの記述という観点では同じように扱うが、 • 実行時の型を強制するキャスト • 型をどのように解釈するかをコンパイラに伝えるアサー ション と言った違いがある 30 Copyright © 2022, Oracle and/or its affiliates
  16. 型ガード typeof • typeof演算子を利用すると、異なるブロック内で異 なる型の形で解釈できる • 下図はnumberとstringのそれぞれで存在しないメ ソッドに対してエラーが出ている instanceof •

    instanceof演算子もtypeofと同様 • 下図は、異なるClass(=instance)のそれぞれで存 在しないフィールドに対してエラーが出ている 33 Copyright © 2022, Oracle and/or its affiliates
  17. デモ: 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(この時点では存在しない)を読み込む
  18. 実際に記述する…その前にプロジェクトの構成 • $ tsc --initの実行 • tsconfig.jsonを自動的に生成 • tsconfig.json内、outDirのコメントアウトを外し、コンパイル成果物(JS)の配置先を 指定

    • index.tsを作成 • 中身はHTML内のJSのまま • ここでまず $ tsc を実行してみる • js/以下にindex.jsが出力されれば、プロジェクトの構成は上手くいっていることになる 36 Copyright © 2022, Oracle and/or its affiliates
  19. TypeScriptでWebページを作ってみる TypeScriptを使ったWeb アプリを作成 • SPA(Single Page Application) • Oracleが提供するフロン トエンドフレームワーク

    (ツールキット)Oracle JETを利用 • フレームワークを利用した 場合のプロジェクト構造 やTypeScripソースの構 造を確認してみる 39 Copyright © 2022, Oracle and/or its affiliates
  20. 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
  21. プロジェクト構造 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固有