generated at
TypeScriptの型
TypeScriptの型は色々なことができる
ただし、以下のことを頭に入れておいたほうが良い
ところどころ運用でカバーが必要
挙動に統一感がない点がある


TypeScriptの型システムに見られる特殊な機能
{ [P in K]: T } , keyof , T[K]
? readonly の付与や除去など
T extends U ? X : Y , infer R



primitiveな型とか、基本的な型


イディオム


便利な型を使う


型のテスト


問題を解いて型を学ぶ
uhyo氏の型演習


library周り


入門者向け
tsの型定義に登場するわけわからん記号を調べるのに便利






自分で型を定義する際のコツ
Haskellで書くならどうなるのかを考えてみる
型レベルではなく普通に
再帰や、head/tailの扱いは応用できる
考え方が違いすぎて、これをやると逆に無理になるケースもあるmrsekut
便利型関数は自前で用意しておくか、見れる位置に置いておくといい
イディオムみたいなのを覚えてないと無理




genericsの型指定を強制する
T=neverと書けばいい
ts
type A<T = never> = {..}
使用される時に、 T を指定しないとerrorになる


この結果も何か名前つけられそうなイディオムではあるmrsekut
いったんtuple内のunion distributionと名付けておこう
ts
type A = [1, ...([2, 3] | [3, 2])]; // [1,2,3]|[1,3,2]
TypeScriptのTuple型 ... と、TypeScriptのUnion型のあわせ技



型引数か否かで結果が異なるやつ
Union型関連のものはdistributeがあるのでだいたい異なる
T extends ..
直接的に never extends never と書いた場合は真
ts
type A = never extends never ? true : false; // true
型引数にした場合は never
ts
type A<T> = T extends never ? true : false; type B = A<never>;
Mapped Typesでのunion distribution
{[P in keyof T]: X} T がunion型の時







いろんな具体例



errorを出さなくても型システム的には問題がないが、
「こう書いた場合は、実装者の意図と異なるだろう」という親切心の元だしているerror



const n=1 const n:1=1 の違い
ref 『実践TypeScript』 p.55
Literal型にわざわざ型を明示するやつ
普通のリテラル型よりも厳格
ts
const zero: 0 = 0 const one = 1 as 1
↑この辺の値をletの変数に代入してもリテラル型が保持される
普通のリテラル型でやると number になっちゃう
なので、ガチガチのガチ定数はこれを使うと良いのかもなmrsekut
てか全部これにしたらいいのになmrsekut
こんなに厳しいと、なにか不便なことがあるのかな #??






Spread演算子による健全性の喪失


this







型で数値を制限したい
例えば画像などを扱うときは0..255まで範囲しか取れないようにしたい ref
ts
type r = `1|2|3|4|5|6|7|8|9|10................... // やってられない!!!
狭い範囲なら↑この書き方で制限できるが、255とかは流石にやってられない..
こういうPRも出てる
ts
type TRgbColorComponent = 0..255; // こうやって定義したい!





自然数





(T | null)[] filter(t => t != null) をしてもnullableになる問題
なんでこれなるん?
対策



Interface vs type
typeにする


delete演算子を使わずにObjectのpropertyを削除する ref
ts
const { z, ...p2 } = p1; // p1からzを消したp2を作る



Diff型(自作)



型演習良問
ひえー、逆転の発想mrsekut
as any を使う
[4-4
[4-5
[4-6