TypeScriptの型
TypeScriptの型は色々なことができる
ただし、以下のことを頭に入れておいたほうが良い
ところどころ運用でカバーが必要
挙動に統一感がない点がある
TypeScriptの型システムに見られる特殊な機能
Mapped Types
{ [P in K]: T } , keyof, T[K]
?やreadonlyの付与や除去など
Conditional Types
T extends U ? X : Y, infer R
Template Literal Types
satisfies operator
primitiveな型とか、基本的な型
nerver型
unknown型
TypeScriptのTuple型
TypeScriptのObject型, {}型
TypeScriptのobject型
TypeScriptのrecord型
TypeScriptのsymbol型
TypeScriptのUnion型
TypeScriptのEnum型
TypeScriptの関数型
TypeScriptのreadonly
index signature
(Exact型)
イディオム
TypeScriptのあるある部分型の型制約と条件分岐
配列型周りのイディオム
Union型周りのイディオム
record周りのイディオム
便利な型を使う
TypeScriptのbuilt-in types
TypeScriptの型library
型のテスト
TypeScriptの型のtest
問題を解いて型を学ぶ
type-challenges
Type or Treat Challenges
https://devblogs.microsoft.com/typescript/type-treat-2021-day-1/
uhyo氏の型演習
https://qiita.com/uhyo/items/e4f54ef3b87afdd65546
library周り
TypeScriptでlibraryに型をつける
型定義ファイル
入門者向け
TypeScript読解アシスタント
tsの型定義に登場するわけわからん記号を調べるのに便利
TypeScript Error Translator
Pretty TypeScript Errors
#WIP
構造的部分型
TypeScriptの型の階層
Tagged Union
TypeScriptで高階多相型
代入時のoptional?と|undefinedは意味が異なる
自分で型を定義する際のコツ
Haskellで書くならどうなるのかを考えてみる
型レベルではなく普通に
再帰や、head/tailの扱いは応用できる
考え方が違いすぎて、これをやると逆に無理になるケースもあるmrsekut.icon
TypeScriptのあるある部分型の型制約と条件分岐を見てみる
便利型関数は自前で用意しておくか、見れる位置に置いておくといい
Equal<X, Y>とか
イディオムみたいなのを覚えてないと無理
Non-null assertion operator
genericsの型指定を強制する
T=neverと書けばいい
code:ts
type A<T = never> = {..}
使用される時に、Tを指定しないとerrorになる
この結果も何か名前つけられそうなイディオムではあるmrsekut.icon
いったんtuple内のunion distributionと名付けておこう
code: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と書いた場合は真
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>;
T がneverの時の、T extends .. は、問答無用でneverになる
Mapped Tuple Type
Mapped Typesでのunion distribution
https://qiita.com/uhyo/items/da21e2b3c10c8a03952f#mapped-typeのunion-distribution
{[P in keyof T]: X}のTがunion型の時
いろんな具体例
TypeScriptのbuilt-in types
TypeScriptの配列型で基本的な配列操作関数を模倣する
https://susisu.hatenablog.com/entry/2019/10/26/205837
excess property checks
余剰プロパティチェック
https://qiita.com/uhyo/items/b1f806531895cb2e7d9a#余剰プロパティチェック
errorを出さなくても型システム的には問題がないが、
「こう書いた場合は、実装者の意図と異なるだろう」という親切心の元だしているerror
Widening Literal Types
as const
https://zenn.dev/luma/articles/typescript-const-n-1
const n=1とconst n:1=1の違い
https://www.learningtypescript.com/articles/objects-functions-and-type-narrowing
ref 『実践TypeScript』.icon p.55
Literal型にわざわざ型を明示するやつ
普通のリテラル型よりも厳格
code:ts
const zero: 0 = 0
const one = 1 as 1
↑この辺の値をletの変数に代入してもリテラル型が保持される
普通のリテラル型でやるとnumberになっちゃう
なので、ガチガチのガチ定数はこれを使うと良いのかもなmrsekut.icon
てか全部これにしたらいいのになmrsekut.icon
こんなに厳しいと、なにか不便なことがあるのかな #??
Spread演算子による健全性の喪失
https://zenn.dev/misuken/articles/a8aebfa727e49b
https://nymphium.github.io/2020/08/25/tswara.html
this
https://qiita.com/uhyo/items/da21e2b3c10c8a03952f#this
https://qiita.com/uhyo/items/da21e2b3c10c8a03952f#this型
Type Chekerを作る
型で数値を制限したい
例えば画像などを扱うときは0..255まで範囲しか取れないようにしたい ref
code:ts
type r = `1|2|3|4|5|6|7|8|9|10................... // やってられない!!!
狭い範囲なら↑この書き方で制限できるが、255とかは流石にやってられない..
こういうPRも出てる
code:ts
type TRgbColorComponent = 0..255; // こうやって定義したい!
実装している人いた
自然数
https://github.com/thomaseding/nat-ts
https://falsandtru.hatenablog.com/entry/typescript-formal-proof-using-union-types
https://falsandtru.hatenablog.com/entry/type-level-typescript
https://ryota-ka.hatenablog.com/entry/2017/12/21/000000
https://github.com/Microsoft/TypeScript/issues/14833
https://github.com/fightingcat/sits
https://kgtkr.net/blog/2019/04/15/typescript-typelevelprogramming-error-suppression
(T | null)[]をfilter(t => t != null)をしてもnullableになる問題
なんでこれなるん?
対策
https://stackoverflow.com/questions/43118692/typescript-filter-out-nulls-from-an-array
https://qiita.com/mangano-ito/items/5583783cd88ea5f4deb4
https://medium.com/@martin_hotell/interface-vs-type-alias-in-typescript-2-7-2a8f1777af4c
Interface vs type
/terrierscript/ReactでTypeScript使うときにPropsやStateってinterfaceよりType Aliasの方よいのでは説
https://twitter.com/oukayuka/status/1208911601027313667
typeにする
delete演算子を使わずにObjectのpropertyを削除する ref
code:ts
const { z, ...p2 } = p1; // p1からzを消したp2を作る
Diff型(自作)
https://qiita.com/nullabletypo/items/999fe07d079298c35e0c
型演習良問
3-5
ひえー、逆転の発想mrsekut.icon
4-1
as anyを使う
4-3
[4-4
[4-5
[4-6
https://gist.github.com/kenmori/8cea4b82dd12ad31f565721c9c456662