2017-11-14 17 views
1

私は可能ではないと思っていますが、質問する価値はあります。 ジェネリックメソッドまたはクラスでは、使用されているジェネリックTタイプの名前をログに記録したいと思います。文字列として必要です。Typescriptジェネリック型T toString

このような方法を想像:

let m = getTypeName<Message>(); // Expected string "Message" 
let p = getTypeName<Person>(); // Expected string "Person" 

上記getTypeNameメソッドが間違っている、それもビルドしません。

static getTypeName<T>(): string { 
    return typeof T; // This is wrong 
} 

は、私がこのようにそれを使用できるように期待を。 typeofはJSで蒸散され、所望の効果が得られません。 私は様々なことを試みましたが、成功しませんでした。

実際に行う方法はありますか?

EDIT:これはなぜの重複はありません:this question

質問とサンプルコードは、オブジェクトではなく、指定されたタイプの名前を取り戻す方法を示しています。 "[ts]型 'typeof MyType'の引数が 'new()'型のパラメータに代入されないため、このメソッドは汎用ではありません。 => MyType '。 " さらに、ジェネリックメソッド内で関数を使用する場合、パラメータとしてTを使用することはできません。つまり、ジェネリックタイプから名前を取得する必要があるすべての場所に、ctorを追加する必要があります。パラメータ。

+1

を追加しました:https://stackoverflow.com/questions/41160690/is-it-possible-to-get-the-type-name-of-a-generic-type – artem

+1

可能[generic型の型名を取得することは可能ですか?](https://stackoverflow.com/questions/41160690/is-it-possible-to-get-the-type-name-of-a-ジェネリック型) – Duncan

答えて

0

回答hereを使用して、私のニーズをより良くカバーするように修正しましたが、これは私の完全な答えではありません。コンパイルしてテストをパスしても、VSとVSコード。

ヘルパークラス:

export class TypeHelper { 

    static typeName(ctor: { name:string }) : string { 
     return ctor.name; 
    } 
} 

テストクラス(ジャスミン仕様):

import { TypeHelper } from './../util/TypeHelper'; 

class MyClass { 
    public MyGenericMethod<T>(): string { 
     let iNeedTheTypeNameHere = TypeHelper.typeName(T); 
     return `Use the string here somehow: ${iNeedTheTypeNameHere}`; 
    } 
} 
describe("TypeHelper",() => { 
    describe("TypeHelper",() => { 
     it("typeName, returns the string type name of the Class passed as parameter",() => { 
      let t = TypeHelper.typeName(TypeHelper); 
      expect(t).toBe("TypeHelper"); 
      let m = TypeHelper.typeName(MyClass); 
      expect(m).toBe("MyClass"); 
     }); 

     it("typeName, returns the string type name of a generic type T passed as parameter",() => { 
      let myClass = new MyClass(); 
      let t = myClass.MyGenericMethod<TypeHelper>();   
      expect(t).toBe("TypeHelper"); 
      let m = myClass.MyGenericMethod<MyClass>();  
      expect(m).toBe("MyClass"); 
     }); 
    }); 
}); 

エラー: [TS] 'T' が唯一のタイプを意味するが、使用されていますここに値として。

私はTSエキスパートではありませんが、この問題を解決する方法を理解するためにこれを検討していきます。

EDIT:playground example関連

関連する問題