質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.53%
Generics

Genericsはパラメトリックなポリモーフィズムの形態であり、.NET やJavaなど、様々な言語に実装されています。C++のテンプレートと同等の機能を持ち合わせています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

1回答

1178閲覧

TypeScriptのジェネリクス<T>で引き渡されたclassやfunction内でTの型を確認する方法を教えて下さい。

UnripeTomato

総合スコア25

Generics

Genericsはパラメトリックなポリモーフィズムの形態であり、.NET やJavaなど、様々な言語に実装されています。C++のテンプレートと同等の機能を持ち合わせています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

1グッド

3クリップ

投稿2021/04/07 05:12

前提・実現したいこと

掲題の通り、ジェネリクスに引き渡された<T>の型を実行時に確認したく思います。
後述する「実現したいコード」および「試してみたこと」について、
ご助言いただけますと幸いです。

環境

tsconfig.jsoncompilerOptionsは以下のように設定しています。

typescript

1"target": "es2018", 2"module": "CommonJS", 3"lib": ["esnext"], 4"strict": true, 5"experimentalDecorators": true, 6"esModuleInterop": true, 7"skipLibCheck": true, 8"forceConsistentCasingInFileNames": true

該当のソースコード

以下のように、メソッド引数に <T> を利用すれば、typeof によって確認することができます。

typescript

1function fn<T>(myType: T) { 2 console.log(typeof myType); 3} 4fn<number>(12345); 5//->> number 6 7class hoge<T> { 8 log(myType: T) { 9 console.log(typeof myType); 10 } 11} 12const hogeObj = new hoge<string>() 13hogeObj.log("123"); 14//->> string

実現したいコード

しかし、以下のようにメソッド引数を利用しない場合<T>の型を直接確認する方法がないものか、ご教示いただけませんでしょうか

  • ファンクションに<T>を指定して引数がないパターン

typescript

1function fn<T>() { 2 console.log(T); 3} 4fn<number>(); 5// コンパイルエラー

このコードでは、numberを取得したいです。

  • クラスに<T>を指定して引数がないパターン

typescript

1class hoge<T> { 2 log() { 3 console.log(T); 4 } 5} 6const hogeObj = new hoge<string>() 7hogeObj.log(); 8// コンパイルエラー

このコードでは、stringを取得したいです。

試してみたこと

クラスの<T>ならば、コンストラクタでごまかすことを試してみましたが、期待していない結果となってしまいました。

typescript

1class hoge<T> { 2 constructor(private c: {new(): T; }){} 3 log() { 4 console.log(this.c); 5 console.log(typeof this.c); 6 } 7} 8const hogeObj = new hoge<String>( String ) 9hogeObj.log(); 10//->> [Function: String] 11//->> function

//期待しているのはStringだが、newを実装していない型には利用できない。

このコードに関して、もし可能でしたら、this.c [Function: String] から、
Stringを取得する方法をご教示いただけますと幸いです。

お手数をおかけいたしますが、よろしくお願い申し上げます。

obsult👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

3

ベストアンサー

無理です。

TypeScriptの型はトランスパイル前にしか存在せず、JavaScriptへの変換で消えてしまうものなので、実行時に型を取得する方法はありません。

投稿2021/04/07 06:17

maisumakun

総合スコア145006

obsult, takapiroid, UnripeTomato👍を押しています

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

UnripeTomato

2021/04/07 15:18

ご回答いただきありがとうございます。 トランスパイルで型が飛んでしまうのですね・・・なるほど・・・ 確かにtscすると、Tがあろうがなかろうが消えてしまうことを確認しました。 別の方法を考えます。 ```typescript function fn<T>(myType: T) { console.log(typeof myType); } fn<number>(12345); ↓↓↓↓↓↓↓↓↓↓↓ function fn(myType) { console.log(typeof myType); } fn(12345); ``` 明確な回答をいただき、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.53%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

同じタグがついた質問を見る

Generics

Genericsはパラメトリックなポリモーフィズムの形態であり、.NET やJavaなど、様々な言語に実装されています。C++のテンプレートと同等の機能を持ち合わせています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。