SlideShare a Scribd company logo
第2回 TypeScript という言語
TypeScript & 関数型講座
今講座のコンセプト
これから TypeScript を使う人には
実践を想定した TypeScript の重要な機能を学習できるように
今 JavaScript, Java, Scala を使っている人には
それらと比較して TypeScript がどのような言語なのかを知ってもらえるように
TypeScript の概要
● TypeScript はマイクロソフトによって開発され、メンテナンスされているフリーで
オープンソースのプログラミング言語
● TypeScript は JavaScript に対して、省略も可能な静的型付けとクラスベースオ
ブジェクト指向を加えた厳密なスーパーセットとなっている(いわゆる AltJS)
● つまり、型定義できる JavaScript
TypeScript の言語仕様
ただ一つの値のみとる型
他の言語ではあまり見られない(と思ったけど、Scala3 に入る予定)
リテラル型
const a = 100 // 100
const b = 'a' // a
const c = true // true
const d: 101 = 100 // 型 '100' を型 '101' に割り当てることはできません。
関数の型
// TypeScript
const test:(a: number, b: number) => number = (a, b) => a + b
// Scala
val test: (Int, Int) => Int = (a, b) => a + b
// Java
BiFunction<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 // any
const b: any = 'danger' // any
const c = a + b // any
any 型
プログラマの敗北
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: void
constructor(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 class
interface は複数継承することが可能。そのため、一つのオブジェクトに複数の振る舞
いを持たせることができる。
複数の場所で型レベルの制約を強制するために使われるプレースホルダーの型。
ジェネリック型
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 | Dog
const test1: CatOrDog = { name: 'coco', purrs: true } // OK
const test2: CatOrDog = { name: 'boss', barks: true } // OK
const test3: CatOrDog = { name: 'boss', purrs: false, barks: true } // OK
const 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 | null
result.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 | boolean
if (typeof a === 'number') return console.log('number')
const c = a // const c: string | boolean
if (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 & Dog
const test1: CatAndDog = { name: 'coco', purrs: true } // NG
const test2: CatAndDog = { name: 'boss', barks: true } // NG
const test3: CatAndDog = { name: 'boss', purrs: false, barks: true } // OK
const 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
}
}

More Related Content

What's hot (20)

PPTX
Redisの特徴と活用方法について
Yuji Otani
 
PPTX
幅広なテスト分析ができるようになろう
scarletplover
 
PDF
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Masahito Zembutsu
 
PDF
ナレッジグラフ/LOD利用技術の入門(後編)
KnowledgeGraph
 
PDF
RESTful API 入門
Keisuke Nishitani
 
PDF
20190814 AWS Black Belt Online Seminar AWS Serverless Application Model
Amazon Web Services Japan
 
PDF
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
 
PPTX
初心者向けMongoDBのキホン!
Tetsutaro Watanabe
 
PDF
20190206 AWS Black Belt Online Seminar Amazon SageMaker Basic Session
Amazon Web Services Japan
 
PDF
「スキルなし・実績なし」 32歳窓際エンジニアがシリコンバレーで働くようになるまで
Shuichi Tsutsumi
 
PDF
異次元のグラフデータベースNeo4j
昌桓 李
 
PDF
SageMakerでもAUTOMATIC1111したい
真吾 吉田
 
PDF
GraphQL入門 (AWS AppSync)
Amazon Web Services Japan
 
PDF
世界最強のソフトウェアアーキテクト
Yahoo!デベロッパーネットワーク
 
PDF
RDF Semantic Graph「RDF 超入門」
オラクルエンジニア通信
 
PDF
エンジニアから飛んでくるマサカリを受け止める心得
Reimi Kuramochi Chiba
 
PDF
クラスローダーについて
Suguru ARAKAWA
 
PDF
今日こそ理解するHot変換
Yuki Takahashi
 
PDF
LINE Login総復習
Naohiro Fujie
 
Redisの特徴と活用方法について
Yuji Otani
 
幅広なテスト分析ができるようになろう
scarletplover
 
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Masahito Zembutsu
 
ナレッジグラフ/LOD利用技術の入門(後編)
KnowledgeGraph
 
RESTful API 入門
Keisuke Nishitani
 
20190814 AWS Black Belt Online Seminar AWS Serverless Application Model
Amazon Web Services Japan
 
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
 
初心者向けMongoDBのキホン!
Tetsutaro Watanabe
 
20190206 AWS Black Belt Online Seminar Amazon SageMaker Basic Session
Amazon Web Services Japan
 
「スキルなし・実績なし」 32歳窓際エンジニアがシリコンバレーで働くようになるまで
Shuichi Tsutsumi
 
異次元のグラフデータベースNeo4j
昌桓 李
 
SageMakerでもAUTOMATIC1111したい
真吾 吉田
 
GraphQL入門 (AWS AppSync)
Amazon Web Services Japan
 
世界最強のソフトウェアアーキテクト
Yahoo!デベロッパーネットワーク
 
RDF Semantic Graph「RDF 超入門」
オラクルエンジニア通信
 
エンジニアから飛んでくるマサカリを受け止める心得
Reimi Kuramochi Chiba
 
クラスローダーについて
Suguru ARAKAWA
 
今日こそ理解するHot変換
Yuki Takahashi
 
LINE Login総復習
Naohiro Fujie
 

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

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

Recently uploaded (6)

PDF
【AITRIOS】人vs生成AIでジェスチャーゲームをAITIROSを使ってしてみた
ueda0116
 
PDF
React Native vs React Lynx (React Native Meetup #22)
Taiju Muto
 
PDF
音学シンポジウム2025 招待講演 遠隔会話音声認識のための音声強調フロントエンド:概要と我々の取り組み
Tsubasa Ochiai
 
PDF
フィジカルAI時代のセキュリティ:ロボティクスとAIセキュリティの融合のあり方
Osaka University
 
PPTX
[Liberaware] Engineer Summer Internship.pptx
koyamakohei
 
PDF
AWS BedrockによるIoT実装例紹介とAI進化の展望@AWS Summit ExecLeaders Scale Session
Osaka University
 
【AITRIOS】人vs生成AIでジェスチャーゲームをAITIROSを使ってしてみた
ueda0116
 
React Native vs React Lynx (React Native Meetup #22)
Taiju Muto
 
音学シンポジウム2025 招待講演 遠隔会話音声認識のための音声強調フロントエンド:概要と我々の取り組み
Tsubasa Ochiai
 
フィジカルAI時代のセキュリティ:ロボティクスとAIセキュリティの融合のあり方
Osaka University
 
[Liberaware] Engineer Summer Internship.pptx
koyamakohei
 
AWS BedrockによるIoT実装例紹介とAI進化の展望@AWS Summit ExecLeaders Scale Session
Osaka University
 
Ad

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