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.icon
便利型関数は自前で用意しておくか、見れる位置に置いておくといい
イディオムみたいなのを覚えてないと無理
genericsの型指定を強制する
code:ts
type A<T = never> = {..}
使用される時に、Tを指定しないとerrorになる
この結果も何か名前つけられそうなイディオムではあるmrsekut.icon
code:ts
型引数か否かで結果が異なるやつ
Union型関連のものはdistributeがあるのでだいたい異なる
T extends ..
直接的にnever extends neverと書いた場合は真
code:ts
type A = never extends never ? true : false; // true
型引数にした場合はnever
code:ts
type 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 『実践TypeScript』.icon p.55
Literal型にわざわざ型を明示するやつ
普通のリテラル型よりも厳格
code:ts
const zero: 0 = 0
const one = 1 as 1
↑この辺の値をletの変数に代入してもリテラル型が保持される
普通のリテラル型でやるとnumberになっちゃう
なので、ガチガチのガチ定数はこれを使うと良いのかもなmrsekut.icon
てか全部これにしたらいいのになmrsekut.icon
こんなに厳しいと、なにか不便なことがあるのかな #?? this
型で数値を制限したい
例えば画像などを扱うときは0..255まで範囲しか取れないようにしたい ref code:ts
type r = `1|2|3|4|5|6|7|8|9|10................... // やってられない!!!
狭い範囲なら↑この書き方で制限できるが、255とかは流石にやってられない..
code:ts
type TRgbColorComponent = 0..255; // こうやって定義したい!
自然数
(T | null)[]をfilter(t => t != null)をしてもnullableになる問題
なんでこれなるん?
対策
Interface vs type
typeにする
delete演算子を使わずにObjectのpropertyを削除する ref code:ts
const { z, ...p2 } = p1; // p1からzを消したp2を作る
Diff型(自作)
型演習良問
ひえー、逆転の発想mrsekut.icon
as anyを使う
[4-4
[4-5
[4-6