Movatterモバイル変換


[0]ホーム

URL:


Uploaded bygypsygypsy
PDF, PPTX409 views

TypeScript & 関数型講座 第2回 TypeScript という言語

第2回 TypeScript という言語

Embed presentation

Download as PDF, PPTX
第2回 TypeScript という言語TypeScript & 関数型講座
今講座のコンセプトこれから TypeScript を使う人には実践を想定した TypeScript の重要な機能を学習できるように今 JavaScript, Java, Scala を使っている人にはそれらと比較して TypeScript がどのような言語なのかを知ってもらえるように
TypeScript の概要● TypeScript はマイクロソフトによって開発され、メンテナンスされているフリーでオープンソースのプログラミング言語● TypeScript は JavaScript に対して、省略も可能な静的型付けとクラスベースオブジェクト指向を加えた厳密なスーパーセットとなっている(いわゆる AltJS)● つまり、型定義できる JavaScript
TypeScript の言語仕様
ただ一つの値のみとる型他の言語ではあまり見られない(と思ったけど、Scala3 に入る予定)リテラル型const a = 100 // 100const b = 'a' // aconst c = true // trueconst d: 101 = 100 // 型 '100' を型 '101' に割り当てることはできません。
関数の型// TypeScriptconst test:(a: number, b: number) => number = (a, b) => a + b// Scalaval test: (Int, Int) => Int = (a, b) => a + b// JavaBiFunction<Integer, Integer, Integer> test = (a, b) -> a + b;Java の関数は第一級オブジェクトではないが、関数型インターフェースというものを利用して第一級オブジェクトっぽく見せている。
void 型関数の返り値の型として使われ、「何も返さない」ことを表すJavaScript では何も返さない関数は undefined となるため、void 型の値はundefinde のみ。function hello(): void {console.log('hello')}Java でも同様に void が存在する。Scala では Unit 型が大体同じことをしている。(厳密に void と Unit が同じなのかまでは調べていない)
const a: any = 666 // anyconst b: any = 'danger' // anyconst c = a + b // anyany 型プログラマの敗北any を使うと TypeScript が持つ型の優位性が無くなり、ただの JavaScript と同じ振る舞いになってしまう。そのため、やむをえない場合以外使うべきではない型を無視するためのものなので、Java、Scalaにはない
プログラミングのスタイルの一種で、あるオブジェクトが特定のプロパティを持つことだけを重視し、その名前が何であるか(名前的型付け)は気にしない。一部の言語ではダックタイピングと呼ばれている。構造的型付けclass User {constructor(public readonly name: string) {}}class Cat {constructor(public readonly name: string) {}}const cat: Cat = new User('bob')
TypeScript で名前的型付け的なことをするには、ちょっとした工夫が必要。構造的型付けclass User {private readonly __nominal: void // private な要素を持たせることにより、他の構造と区別できるconstructor(public readonly name: string) {}}class Cat {private readonly __nominal: voidconstructor(public readonly name: string) {}}const cat: Cat = new User('bob')// 型 'User' を型 'Cat' に割り当てることはできません。// 複数の型に、プライベート プロパティ '__nominal' の異なる宣言が含まれています
型エイリアスある型を指し示す別名を宣言することができるtype User = {name: string}class User2 {constructor(public readonly name: string) {}}const a: User = new User2('bob') // 構造的型付けなので代入可能
型エイリアス一応 Scala でも可能type User = { def name: String }case class User2(name: String) {}val user: User = User2("bob")Java には存在しない
interface型エイリアスと同様に、構造に名前をつけるための方法。小さな差異がいくつかあるが、ほとんど型エイリアスと同じ。interface User {name: string}class User2 {constructor(public readonly name: string) {}}const a: User = new User2('bob') // 構造的型付けなので代入可能
interface のメリット定義と実装を分けることができ、プログラムを柔軟に保てる。interface JournalRepository { getById: (id: number) => Journal }class HttpJournalRepository implements JournalRepository {getById(id: number): Journal { // サーバーからデータ取得 }}class InmemoryJournalRepository implements JournalRepository {getById(id: number): Journal { // インメモリーでデータ取得 }}// 実装を切り替えても、プログラムの変更は必要ないfunction getJournal(id: number, repository: JournalRepository): Journal {return repository.getById(id)}
interface VS classinterface は複数継承することが可能。そのため、一つのオブジェクトに複数の振る舞いを持たせることができる。
複数の場所で型レベルの制約を強制するために使われるプレースホルダーの型。ジェネリック型class Some<T> {constructor(public readonly value: T) {}map<U>(f: (v: T) => U): Some<U> {return new Some(f(this.value))}}
ジェネリック型パラメータに制限を加えられる型境界class A { private type = 'A' }class B {}class C extends A {}class Some<T extends A> {constructor(public readonly value: T) {}}const someB = new Some(new B())// 型 'B' の引数を型 'A' のパラメーターに割り当てることはできません。// プロパティ 'type' は型 'B' にありませんが、型 'A' では必須です。const someC = new Some(new C())
配列のサブタイプで、固定長の配列を型付けするための型。タプル型const a: [string, boolean] = ['test', true]const b: [string, boolean] = ['test', true, 1]// 型 '[string, true, number]' を型 '[string, boolean]' に割り当てることはできません。// ソースには 3 個の要素がありますが、ターゲットで使用できるのは 2 個のみです。const c: [string, boolean] = ['test', 1]// 型 'number' を型 'boolean' に割り当てることはできません。Java にはない。あくまで型を定義するのが面倒な場合の代替手段。多用は厳禁(Elm のようにタプルの要素は 3 つまで、と要素数の制限を入れている言語もある)
合併型A と B という 2 つのものがある場合、それらの合併(union)とは、それらの和(A, B, またはその両方に含まれる全てのもの )を指す。TypeScript では、型の合併を表現する特別な型演算子が用意されている。type Cat = { name: string, purrs: boolean }type Dog = { name: string, barks: boolean }type CatOrDog = Cat | Dogconst test1: CatOrDog = { name: 'coco', purrs: true } // OKconst test2: CatOrDog = { name: 'boss', barks: true } // OKconst test3: CatOrDog = { name: 'boss', purrs: false, barks: true } // OKconst test4: CatOrDog = { name: 'boss' }// 型 '{ name: string; }' を型 'CatOrDog' に割り当てることはできません。// プロパティ 'barks' は型 '{ name: string; }' にありませんが、型 'Dog' では必須です。
合併型こんなことも。function test(value: string | number): null | number {if (typeof value === 'number') {return 10} else {return null}}function test2(): void {const result = test(1) // const result: number | nullresult.toString() // NG Object is possibly 'null'.}
合併型Scala3 で取り入れられる予定。Java には存在しない。
function test(a: number | string | boolean | null): void {if (a == null) return console.log('null')const b = a // const b: string | number | booleanif (typeof a === 'number') return console.log('number')const c = a // const c: string | booleanif (typeof a === 'string') return console.log('string')const d = a // const d: boolean}型の絞り込みTypeScript はフローベースの型推論を行う。これにより、型の絞り込みを提供する。
trait 積木case object 三角の積み木 extends 積木case object 四角の積み木 extends 積木case object 丸の積み木 extends 積木trait Tree[T]case class Leaf[T](value: T) extends Tree[T]case class Branch[T](value: Seq[Tree[T]]) extends Tree[T]タグ付き合併型TypeScript で代数的データ型を表現する方法代数的データ型とは、総体と、それを構成する構成子からなるデータ構造である
interface 三角の積み木 {readonly type: '三角の積み木'readonly a: string}interface 四角の積み木 {readonly type: '四角の積み木'readonly b: number}interface 丸の積み木 {readonly type: '丸の積み木'readonly c: boolean}type 積木 = 三角の積み木 | 四角の積み木 | 丸の積み木タグ付き合併型TypeScript では、文字列リテラルを用いた「タグ」というものを利用して表現する
// Not all code paths return a value.function test(value: 積木) {switch (value.type) {case '三角の積み木':return value.a // 型の絞り込みにより、三角のプロパティが使用できるcase '四角の積み木':return value.b}}タグ付き合併型代数的データ型のメリットは、パターンマッチでの網羅チェックを行えることである。(要出典)あと、再帰的データ構造を簡単に定義できる。※ tsconfig.json で noImplicitReturns を true にする必要あり
交差型A と B という 2 つのものがある場合、それらの交差(intersection)とは、それらの積(A と B両方に含まれる全てのもの )を指す。TypeScript では、型の交差を表現する特別な型演算子が用意されている。type Cat = { name: string, purrs: boolean }type Dog = { name: string, barks: boolean }type CatAndDog = Cat & Dogconst test1: CatAndDog = { name: 'coco', purrs: true } // NGconst test2: CatAndDog = { name: 'boss', barks: true } // NGconst test3: CatAndDog = { name: 'boss', purrs: false, barks: true } // OKconst test4: CatAndDog = { name: 'boss' } // NG
function isNonEmpty<A>(fa: ReadonlyArray<A>): fa is ReadonlyNonEmptyArray<A> {return fa.length > 0}function test(value: ReadonlyArray<string>) {if (isNonEmpty(value)) {const a = value // const a: ReadonlyNonEmptyArray<string>}}ユーザー定義型ガード引数を 1 つ取り、boolean を返す関数は、その引数の型を絞り込み可能にできる
readonly 修飾子フィールドに初期値を割り当てた後でそのフィールドを変更できないことを宣言できる。オブジェクトを不変にするために非常に重要。const user: {readonly name: string} = {name: 'bob'}user.name = 'alice' // 読み取り専用プロパティであるため、 'name' に代入することはできません。
オプション (?) 修飾子TypeScript に、あるものが省略可能であることを伝える修飾子function test(a?: number): number {return a}// Type 'number | undefined' is not assignable to type 'number'.// Type 'undefined' is not assignable to type 'number'function test2(a?: number): number {if (a === undefined) {return 0} else {return a}}

Recommended

PPTX
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
PDF
Javaのログ出力: 道具と考え方
PPTX
RLSを用いたマルチテナント実装 for Django
PPTX
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PDF
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
PPTX
Redisの特徴と活用方法について
PDF
コンテナ時代にインフラエンジニアは何をするのか
PPTX
FAPI and beyond - よりよいセキュリティのために
PDF
ヤフー社内でやってるMySQLチューニングセミナー大公開
PPTX
20220409 AWS BLEA 開発にあたって検討したこと
PDF
AWS Black Belt Online Seminar 2017 AWS Elastic Beanstalk
PDF
AWS Black Belt Tech シリーズ 2016 - Amazon SES
PDF
マルチテナント化で知っておきたいデータベースのこと
PDF
PostgreSQL Unconference #5 ICU Collation
PDF
ログ管理のベストプラクティス
PDF
MySQL 5.7にやられないためにおぼえておいてほしいこと
PDF
Ingress on Azure Kubernetes Service
PDF
APICのREST API入門
PPTX
分散トレーシングAWS:X-Rayとの上手い付き合い方
PDF
Confluenceショートカットキー表 v1
PDF
[AKIBA.AWS] VGWのルーティング仕様
PDF
あなたの知らないPostgreSQL監視の世界
PDF
20200721 AWS Black Belt Online Seminar AWS App Mesh
PPTX
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
PDF
マイクロにしすぎた結果がこれだよ!
PDF
PostgreSQLでスケールアウト
PDF
Twitterのsnowflakeについて
PDF
Kubernetes雑にまとめてみた 2020年8月版
PDF
TypeScript で型を上手く使う試み.pdf
PDF
TypeScript 言語処理系ことはじめ

More Related Content

PPTX
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
PDF
Javaのログ出力: 道具と考え方
PPTX
RLSを用いたマルチテナント実装 for Django
PPTX
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PDF
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
PPTX
Redisの特徴と活用方法について
PDF
コンテナ時代にインフラエンジニアは何をするのか
PPTX
FAPI and beyond - よりよいセキュリティのために
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
Javaのログ出力: 道具と考え方
RLSを用いたマルチテナント実装 for Django
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
Redisの特徴と活用方法について
コンテナ時代にインフラエンジニアは何をするのか
FAPI and beyond - よりよいセキュリティのために

What's hot

PDF
ヤフー社内でやってるMySQLチューニングセミナー大公開
PPTX
20220409 AWS BLEA 開発にあたって検討したこと
PDF
AWS Black Belt Online Seminar 2017 AWS Elastic Beanstalk
PDF
AWS Black Belt Tech シリーズ 2016 - Amazon SES
PDF
マルチテナント化で知っておきたいデータベースのこと
PDF
PostgreSQL Unconference #5 ICU Collation
PDF
ログ管理のベストプラクティス
PDF
MySQL 5.7にやられないためにおぼえておいてほしいこと
PDF
Ingress on Azure Kubernetes Service
PDF
APICのREST API入門
PPTX
分散トレーシングAWS:X-Rayとの上手い付き合い方
PDF
Confluenceショートカットキー表 v1
PDF
[AKIBA.AWS] VGWのルーティング仕様
PDF
あなたの知らないPostgreSQL監視の世界
PDF
20200721 AWS Black Belt Online Seminar AWS App Mesh
PPTX
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
PDF
マイクロにしすぎた結果がこれだよ!
PDF
PostgreSQLでスケールアウト
PDF
Twitterのsnowflakeについて
PDF
Kubernetes雑にまとめてみた 2020年8月版
ヤフー社内でやってるMySQLチューニングセミナー大公開
20220409 AWS BLEA 開発にあたって検討したこと
AWS Black Belt Online Seminar 2017 AWS Elastic Beanstalk
AWS Black Belt Tech シリーズ 2016 - Amazon SES
マルチテナント化で知っておきたいデータベースのこと
PostgreSQL Unconference #5 ICU Collation
ログ管理のベストプラクティス
MySQL 5.7にやられないためにおぼえておいてほしいこと
Ingress on Azure Kubernetes Service
APICのREST API入門
分散トレーシングAWS:X-Rayとの上手い付き合い方
Confluenceショートカットキー表 v1
[AKIBA.AWS] VGWのルーティング仕様
あなたの知らないPostgreSQL監視の世界
20200721 AWS Black Belt Online Seminar AWS App Mesh
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
マイクロにしすぎた結果がこれだよ!
PostgreSQLでスケールアウト
Twitterのsnowflakeについて
Kubernetes雑にまとめてみた 2020年8月版

Similar to TypeScript & 関数型講座 第2回 TypeScript という言語

PDF
TypeScript で型を上手く使う試み.pdf
PDF
TypeScript 言語処理系ことはじめ
PDF
Python と型ヒント (Type Hints)
KEY
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
PDF
すごいH 第12章モノイド
PDF
JSX / Haxe / TypeScript
PDF
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
PDF
ng-japan 2015 TypeScript+AngularJS 1.3
PDF
TypeScript超入門
PPTX
JavaScript使いのためのTypeScript実践入門
PDF
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
PDF
TypeScript 1.0 オーバービュー
PDF
TypeScript と Visual Studio Code
PPTX
大人のお型付け
PDF
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
PDF
TypeScript0.9
PDF
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
PDF
すごいHaskell読書会
PDF
TypeScript & 関数型講座 第1回 型の重要性
PDF
TypeScriptは明日から使うべき
TypeScript で型を上手く使う試み.pdf
TypeScript 言語処理系ことはじめ
Python と型ヒント (Type Hints)
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
すごいH 第12章モノイド
JSX / Haxe / TypeScript
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
ng-japan 2015 TypeScript+AngularJS 1.3
TypeScript超入門
JavaScript使いのためのTypeScript実践入門
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
TypeScript 1.0 オーバービュー
TypeScript と Visual Studio Code
大人のお型付け
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
TypeScript0.9
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
すごいHaskell読書会
TypeScript & 関数型講座 第1回 型の重要性
TypeScriptは明日から使うべき

TypeScript & 関数型講座 第2回 TypeScript という言語


[8]ページ先頭

©2009-2025 Movatter.jp