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
Tatsuya Miyamae
October 11, 2022
Programming
510
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
TypeScript基礎
Tatsuya Miyamae
October 11, 2022
More Decks by Tatsuya Miyamae
See All by Tatsuya Miyamae
パスキー(Passkeys)入門
miyamae
0
15
ViewComponent による コンポーネント指向 UI 開発
miyamae
0
210
プログラマのためのChatGPT
miyamae
1
180
NextJSと静的ホスティングサービス
miyamae
0
330
Cloudflare
miyamae
0
92
ブラウザでうごく! ES6+ モダンJavaScript
miyamae
0
1.5k
Other Decks in Programming
See All in Programming
AWS CDK を「作」ってみた 〜フルスクラッチで見えた CDK の裏側〜 / aws-cdk-from-scratch
gotok365
3
2.8k
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
300
TSX の <Hoge<Fuga>> という構文に驚いた話 / tsx-type-argument-syntax
kanaru0928
0
200
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
210
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
4
1.8k
React本体のコードリーディング
high_g_engineer
1
130
Google Apps Script で Ruby を動かす
kawahara
0
130
これって Effect でできたのでは? / TSKaigi Mashup Kansai #2
susisu
0
140
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
190
信頼性について考えてみる(SRE NEXT 2026 miniLT)
hayama17
0
240
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
380
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
210
Featured
See All Featured
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.8k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
200
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
680
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
64
56k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
230
Ethics towards AI in product and experience design
skipperchong
2
340
Exploring anti-patterns in Rails
aemeredith
3
450
Embracing the Ebb and Flow
colly
88
5.1k
Transcript
TypeScript基礎
参考文献 プロを目指す人のための TypeScript入門 安全なコードの書き方から高度な型の使い方まで 技術評論社 鈴木僚太 著 B5変形判/424ページ 定価3,278円(本体2,980円+税10%) ISBN
978-4-297-12747-3
TypeScriptとは AltJS(JavaScriptに変換して利用する言語=トランスパイラ) かつてはCoffeeScriptとか色々あったが、今はTypeScript一強 JavaScriptに型チェックの機能だけを追加したもの 初期のころに実装された独自機能が少しあるが、今は型定義の機能に限定して設計されている JavaScriptの型チェッカーとしてはかつてはFlow (Facebook)などがあったが、今はTypeScript一強 DenoやBunではトランスパイル不要で.tsのまま実行できる ブラウザでは型周りを無視して実行するという提案なども出ていてWeb標準化が進みつつある
TypeScriptを学ぶ前に ES6以降のJavaScript 同時に学ぼうとするとかえって効率が悪い。先にES6を学んでおこう
TypeScriptのメリット・デメリット メリット 多くのエラーを実行前に検出できる 型が仕様書として機能する エディタの開発支援機能の恩恵 強力なエディタ補完 書いた瞬間にエラー検出 安全にリファクタリング デメリット コンパイルが必要
開発環境ではソース保存時に瞬でコンパイルされるので、ほぼ意識することはないが コード量が多くなる
ゆるくTypeScriptへ移行するには 全部型定義しなければならないわけではない 利用するライブラリが型付きになるだけでもメリットあるから無理せず ライブラリなどの型定義を見る機会が増えるので、構文はできるだけ知っておいたほうがよさそう まずはとにかく拡張子を .js -> .ts に デフォルトでは関数の引数の型注釈だけは必要
オプションで不要にできる(noImplicitAny) 多くは型を明示しなくても型推論が働く 型注釈が必要なところは、まずは any 型や空のオブジェクト型 {} 指定でユルく 多く使われる箇所から徐々に型を定義していく 機能が多く複雑な印象があるが、柔軟な型定義のためのものなので全部使う必要はない
TypeScript開発環境を作る 少し昔はJavaScriptは開発環境作るの大変だったけど、今は超簡単になっている viteおすすめ。npm入っていれば一瞬で環境作れる $ npm init vite ? Project name:
› hello-vite-ts # ①プロジェクト名を入力 ? Select a framework: › - Use arrow-keys. Return to submit. ❯ vanilla # ②フレームワークを選択(vanilla = フレームワークを使わない) vue react preact lit-element svelte ? Select a variant: › - Use arrow-keys. Return to submit. vanilla ❯ vanilla-ts # ③TypeScript を使用する $ cd hello-vite-ts $ npm install $ npm run dev
型注釈の基本 変数に型注釈を与える 普通のJavaScriptでの変数宣言 TypeScriptでは次の構文で型を指定できる 例 string型で宣言した変数に数値は代入できない(コンパイルエラー) const greeting = "Hello!";
const 変数: 型 = 式; const greeting: string = "Hello!"; const greeting: string = 123; //=> 型 'number' を型 'string' に割り当てることはできません。ts(2322)
型推論 型注釈を書かなくても 型推論により常に型は存在する JavaScriptでは動くコードだが、TypeScriptではコンパイルエラーになる let greeting = "Hello!"; greeting =
123; //=> 型 'number' を型 'string' に割り当てることはできません。ts(2322)
プリミティブ型 基本の組み込み型 string number boolean bigint null undefined symbol ※
symbolはあまり使わない
オブジェクト型 普通にオブジェクトを作った場合 型推論により次にように型定義される const obj = { foo: 123, bar:
"Hello!" }; const obj: { foo: number, bar: string };
明示的に定義するにはこうする あるいは、type文で新しい型を宣言する(型情報を再利用できる) 似た記法でinterface宣言を使う方法もあるが、ほぼ同じなので割愛 const obj: { foo: number, bar: string
} = { foo: 123, bar: "Hello!" }; type FooBar = { foo: number; bar: string; }; const obj: FooBar = { foo: 123, bar: "Hello!" };
インデックスシグネチャ どんな名前のプロパティでも受け入れる 好きな名前のプロパティを作れる = 型安全性を破壊する場合があるので注意 type PriceList = { [key:
string]: number; }; const data: PriceList = {}; data.orange = 123; data.apple = "Hello!"; //=> 型 'string' を型 'number' に割り当てることはできません。ts(2322)
オプショナルなプロパティ type FooBar = { foo: number; bar?: string; };
const obj1: FooBar = { foo: 123 }; const obj2: FooBar = { foo: 123, bar: "Hello!" }; console.log(obj1.bar); //=> "undefined"
読み取り専用プロパティ type Foo = { readonly foo: number; }; const
obj: Foo = { foo: 123 }; obj.foo = 456; // => 読み取り専用プロパティであるため、'foo' に代入することはできません。ts(2540)
部分型関係 部分型とは 他の型と同じ構造を含んでいるなら、その型でもある TypeScriptにおいて非常に重要な概念 type Foo = { foo: number;
}; type FooBar = { foo: number; bar: number; }; const obj1: FooBar = { foo: 123, bar: 456 }; const obj2: Foo = obj1; console.log(obj1.bar); //=> "456" console.log(obj2.bar); //=> プロパティ 'bar' は型 'Foo' に存在しません。ts(2339)
配列の型 number型の値を要素に持つ配列は次のように定義できる number以外は入れられない 次のように書くこともできる(Arrayは組み込みのジェネリック型 ※後述) const arr: number[] = [1,
2, 3]; const arr: number[] = ["Hello!"]; //=> 型 'string' を型 'number' に割り当てることはできません。ts(2322) const arr: Array<number> = [1, 2, 3];
読み取り専用配列型 次のように書くこともできる const arr: readonly number[] = [1, 2, 3];
arr[0] = 10; //=> 型 'readonly number[]' のインデックス シグネチャは、読み取りのみを許可します。ts(2542) const arr: ReadonlyArray<number> = [1, 2, 3];
配列型とユニオン型 複数の型の要素を受け入れるには、ユニオン型を使う const arr: (number | string)[] = [123, "Hello!"];
タプル型 タプル=要素数が固定された配列のこと それぞれの要素に型を指定できる const tpl: [number, string] = [123, "Hello!"];
関数の型 JavaScriptでは関数も変数に入るので、他の変数と同じように型を定義できる 型情報に本来必要のない引数名(name)まで含まれている エディタのコーディング支援機能のためであり、関数の型情報がドキュメントとして機能する 型推論されるのでtype宣言は省略してもいい type SayHelloFunc = (name: string)
=> string; const sayHello: SayHelloFunc = (name) => { return `Hello, ${name}.`; }; const sayHello = (name: string): string => { return `Hello, ${name}.`; };
型引数とジェネリック型 型を利用するときにパラメータを指定できる 型引数を持つ型のことを「ジェネリック型」と呼ぶ 動的に型を作る機能。似た構造の型をいろいろ扱いたい時に有用 type FooBar<T1, T2> = { foo:
T1; bar: T2; }; const obj1: FooBar<string, number> = { foo: "Hello!", bar: 123 }; const obj2: FooBar = {}; //=> ジェネリック型 'FooBar' には 1 個の型引数が必要です。ts(2314)
オプショナルな型引数 型引数のデフォルト値を指定できる 基本は型が決まっているが、たまに変えたいときに有用 type FooBar<T1 = string, T2 = number>
= { foo: T1; bar: T2; }; const obj: FooBar = { foo: "Hello!", bar: 123 };
ジェネリクス 型引数を持つ関数(ジェネリック関数) 戻り値にもT型が使われている stringが入力されたらstring[]を返したいなど、引数に応じて戻り値の型が決まるようなケースで利用される const repeat = <T>(element: T, length:
number): T[] => { const result: T[] = []; for (let i = 0; i < length; i++) { result.push(element); } return result; }; console.log(repeat<string>("a", 5)); //=> ["a","a","a","a","a"] console.log(repeat<number>(123, 3)); //=> [123,123,123] // 型推論されるので型引数は省略してもok console.log(repeat("a", 5));
インターセクション型 「T & U」のように書き、「T型でありかつU型でもある値」を意味する型 このようにオブジェクト型を拡張して新しい型を作る用途で使われることが多い type Animal = { species:
string; age: number; } type Human = Animal & { name: string; }
lookup型 型名を直接書くのではなく「Human型のageプロパティの型」というように指定できる 将来ageの型がbigintに変わったりしても安心 ただし一見して何の型だか分からなくなるため用途に注意 特定のプロパティの値を渡してほしい、という意思表示に使う type Human = { age:
number; }; const setAge = (age: Human["age"]) => { // ... }; // これと同じ意味 const setAge = (age: number) => { // ... };