Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
TypeScript基礎
Search
Tatsuya Miyamae
October 11, 2022
Programming
540
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
30
ViewComponent による コンポーネント指向 UI 開発
miyamae
0
220
プログラマのためのChatGPT
miyamae
1
210
NextJSと静的ホスティングサービス
miyamae
0
350
Cloudflare
miyamae
0
100
ブラウザでうごく! ES6+ モダンJavaScript
miyamae
0
1.6k
Other Decks in Programming
See All in Programming
AIが実装を担う時代の「技術設計」と「チームマネジメント」
kamina_zzz
2
240
Optunaを作ったときにやりたかったこと、その後 (2026/10/16, Optuna Meetup #3)
iwiwi
4
1.5k
Zero-Tap Sign-In対応、結局何をすればいいの?
mitohato14
0
1.9k
Secure Your Coding Agent Like It’s Malware (v1.5) 🇬🇧 @Code.talks 2026
richargh
0
110
そのデザイントークン、Flutterでも同じ見た目になりますか?
nakamizu
0
320
PyConTW 2026 - AI Coding 不只是工具升級, 區域醫院醫療資訊系統協作開發與資訊團隊轉型實踐
cclai999
0
240
私なりのハーネスエンジニアリング ~独自の言語処理系の開発を通して~
seosoft
0
200
AI Augmentation Techniques with Liberty
ivargrimstad
1
410
Kotlinize Is Not Just Converting to Kotlin
chigichan24
1
220
AWS CDKを理解するために公式の定義を深掘って解説してみる / Understanding AWS CDK by Digging into Its Official Definition
akihisaikeda
3
290
SODA - FACT BOOK(JP)
sodainc
1
40k
TS 7.0 で baseUrl が使えなくなった今、パスエイリアスをどうするか
bicstone
2
570
Featured
See All Featured
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
23k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.9k
Making the Leap to Tech Lead
cromwellryan
135
10k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Odyssey Design
rkendrick25
PRO
2
930
Side Projects
sachag
456
43k
Building Flexible Design Systems
yeseniaperezcruz
330
41k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
Believing is Seeing
oripsolob
1
270
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
33
5.7k
Product Roadmaps are Hard
iamctodd
55
13k
The Cost Of JavaScript in 2023
addyosmani
56
10k
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) => { // ... };