TypeScript
https://scrapbox.io/files/61620183145aff001e7a08da.png
主な処理系:
Deno (tsc を内蔵, 型チェック+直接実行, REPL) ts-node (tsc に依存, 型チェック+直接実行, REPL)
swc (JavaScript トランスパイラ, Rust 製) Babel (JavaScript トランスパイラ)
型以外の機能がほとんど全く入らない
TypeScript があるとめちゃくちゃ補完が強くなる
いかれた型がたくさんある
Union Types number | string | undefined
漸進的型付け言語だから仕方がない
Intersection Types { foo: number } & { bar: string }
オブジェクト型のマージに必要になるから仕方がない
Literal Types 3 "Hello"
stream.on("data", handler) みたいな感じでenumっぽく使われるから仕方がない
Tuple Types [number, string, undefined]
実態は配列なのだが、React とかがタプルの代わりとして使いまくるもんだから仕方がない 可変長タプル [string, ...number[]] [string, ...object[], boolean]
可変長部分と固定部分が混ざってることがあるから仕方がない
配列型を引数に展開 (...args: [number, string]) => {}
可変長引数 が配列で表現されているんだから仕方がない Mapped Types {[P in keyof K]: T[P]}
オブジェクト型から特定のキーを抜き出したりすることが必要になるから仕方がない
Conditional Types T extends Promise<infer R> ? R : never
オブジェクトやUnionを条件で絞り込みたくなることもあるから仕方がない
Union Distribution T extends null | undefined ? never : T
Unionの絞り込みに便利(とは思うが、)だから仕方がない(と言ってこんなわけのわからん仕様を盛り込んでよかったのか?)
Template String Types \`${number}meters\`
特定のパターンに沿った文字列を受け取ったり文字列の結合がしたくなることもあるから仕方がない
再帰と条件分岐がある=>チューリング完全なのかは自信がない
型レベルで文字列をパースするなどが書ける