typescriptでの再帰型定義のメモ
circular conditional type police
jcalzは再帰条件型警察
草miyamonz.icon
度々登場したり、なんかリプられてる
This style of construct: type A<T> = { 0: X, 1: A<B<T>>}[T extends Y ? 0 : 1] is not supported; if you use it in production code, do not be surprised if it gives unexpected or broken results in some environments... and any such code should probably feature prominent warnings to that effect.
これは再帰を表現できるのだが、サポートされてない
code:ts
type A<T> = {
0: X,
1: A<B<T>>
だからプロダクションモードで予期せず壊れた結果が起こるかもしれない
それを知らせるのが再帰条件型警察
あとでこの書き方の由来のissueをはる
たぶんtypescript の型はチューリング完全!ってissueだと思う
オブジェクトの定義したやつの後ろに[keyname]とかでアクセスできるんだっけ?
そもそもこれ自体がnot supported?
固有名詞がわからん
ここでもどうようのアクセスはしている
これってまさに使っちゃだめって言われてる方法では?
手元では普通に動いているし使っちゃえヨ!という気持ちがあるmiyamonz.icon
関連
さておき定義を読むと
TがYを継承してたらX
してなかったら、A<B<T>>を返す
B<T>がYを継承してればXを返す
...
The only official word I've seen on this is "don't do it" and "we're not ready for this". If recursive conditional types are ever officially supported in some form, I'd expect to see them included in the baseline tests for the language, so that future releases won't break them. Right now there are no such tests. Use recursive conditional types at your own risk, and inform downstream dependencies of said risk. #26980 seems to be the canonical place to talk about this.
無理やり再帰を計算すると小さい範囲なら大丈夫だけどやばいからやるな とのこと
ところで以下のように定義できると快適なのだが
type Vec<T, N extends number> = N extends 0 ? [] : [T, ...Vec<T, N-1>];
このためには型引数のNを-1する必要がある
typescriptではこれは現状できない
code:ts
type Abs1 = -1 | 1
const a: Abs1 = 1;
const b: Abs1 = -a; // number is not assignable to Type Abs1
コンパイルタイムのnumericな計算は結構issueが上がってるぽいが、皆興味なさそう
3.7から入った再帰の緩和でニーズが上がるのではないか
コンパイル時の型の計算、C++味がでてきて怖いmiyamonz.icon
これの記事は再帰で頑張ってincとdecを作ってる
後のコメントみるとよくわからなくなってきた
結局、一部の再帰的なtype aliasはできるようになったが、
指定した長さの配列を実現するには再帰条件型警察の目をかいくぐるしかないぽい
さらに4.1からもなんか増えた