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の扱いは応用できる
考え方が違いすぎて、これをやると逆に無理になるケースもある

便利型関数は自前で用意しておくか、見れる位置に置いておくといい
イディオムみたいなのを覚えてないと無理
genericsの型指定を強制する
tstype A<T = never> = {..}
使用される時に、 T
を指定しないとerrorになる
この結果も何か名前つけられそうなイディオムではある

tstype A = [1, ...([2, 3] | [3, 2])]; // [1,2,3]|[1,3,2]
型引数か否かで結果が異なるやつ
Union型関連のものはdistributeがあるのでだいたい異なる
T extends ..
直接的に never extends never
と書いた場合は真
tstype A = never extends never ? true : false; // true
型引数にした場合は never
tstype A<T> = T extends never ? true : false;
type B = A<never>;
{[P in keyof T]: X}
の T
がunion型の時
いろんな具体例
errorを出さなくても型システム的には問題がないが、
「こう書いた場合は、実装者の意図と異なるだろう」という親切心の元だしているerror
const n=1
と const n:1=1
の違い
ref

p.55
Literal型にわざわざ型を明示するやつ
普通のリテラル型よりも厳格
tsconst zero: 0 = 0
const one = 1 as 1
↑この辺の値をletの変数に代入してもリテラル型が保持される
普通のリテラル型でやると number
になっちゃう
なので、ガチガチのガチ定数はこれを使うと良いのかもな

てか全部これにしたらいいのにな

こんなに厳しいと、なにか不便なことがあるのかな
#??
this
型で数値を制限したい
例えば画像などを扱うときは0..255まで範囲しか取れないようにしたい
reftstype r = `1|2|3|4|5|6|7|8|9|10................... // やってられない!!!
狭い範囲なら↑この書き方で制限できるが、255とかは流石にやってられない..
tstype TRgbColorComponent = 0..255; // こうやって定義したい!
自然数
(T | null)[]
を filter(t => t != null)
をしてもnullableになる問題
なんでこれなるん?
対策
Interface vs type
typeにする
delete演算子を使わずにObjectのpropertyを削除する
reftsconst { z, ...p2 } = p1; // p1からzを消したp2を作る
Diff型(自作)
型演習良問
ひえー、逆転の発想

as any
を使う
[4-4
[4-5
[4-6