全然違います。
TypeScript
1type TypeX<T> = T
とします。まず簡単な下の方から。これは普通のジェネリクスです。型変数に型を入れることができるやつですね。
TypeScript
1type TypeA<T> = (x: TypeX<T>) => number
2const f: TypeA<number> = (x) => x
これはいつものやつなので問題ないと思われます。では上の方。
TypeScript
1type TypeB = <T>(x: TypeX<T>) => number
2const g: TypeB = (x) => x // Type 'T' is not assignable to type 'number'.
使おうとしてもエラーで怒られます。それはなぜかというと型変数 T
というのは TypeB
の中で閉じていてしまって勝手に外側から入れられないからなんですね。んじゃんなもん何に使うのというと、制約を付けてあげると実は型を代入することが出来ます。
TypeScript
1type TypeC = <T extends number>(x: TypeX<T>) => number
2const h: TypeC = (x: number) => x // OK!
また、型レベルプログラミングで一時的に変数を使いたいけど外に出したくないときなんかに使えます。
TypeScript
1type TypeD<T> = <K extends keyof T>(kv: T, k: K) => T[K]
2type Dict = {
3 'foo': string
4 'bar': string
5 'baz': string
6}
7const dict: Dict = {
8 'foo': 'hoge',
9 'bar': 'fuga',
10 'baz': 'piyo',
11}
12const getSafety: TypeD<Dict> = (kv, k) => {
13 return kv[k]
14}
15getSafety(dict, 'foo') // これは大丈夫
16getSafety(dict, 'nyaan') // これはコンパイルエラー!!
こんなふうに「何回も出てくる型なので書くのがしちめんどくさいから割り当てる」場合か「型レベルプログラミングでバリバリやりたいので一時変数使いてーッ」という場合 type Foo = <T>(x: T)=> T
みたいな書き方になるんじゃなかろうかと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。