次のようなクラスがあったとします:
class X<T> {
val: T;
constructor(val: T) {
this.val = val;
}
}
このクラスを使ったコードを見てください:
const makeX = <T>(val: T): X<T> => new X(val);
const x = makeX('foo').val;
ここで、x
の型はstring
です。
場合によっては、これをstring
ではなく値そのものの型、'foo'
にしたいときもあるかと思います。
TypeScriptではas const
を使うと、値そのものの型を表現することができます。ただジェネリックに対してはas const
を使えません。
どうするかというと、<T extends keyof any>
のように書きます:
const makeX = <T extends keyof any>(val: T): X<T> => new X(val);
const x = makeX('foo').val;
こうすると、x
の型は'foo'
になります。めでたし
もっと良い方法があるよ!という方はお知らせください