2017-11-14 2 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에 옮겨져 원하는 효과를 내지 못한다. 다양한 시도를했지만 성공하지 못했습니다.

실제로 어떤 방법이 있습니까?

편집 :이의 중복없는 이유 : this question

문제는 및 예제 코드가 다시 객체가 아닌 지정된 유형의 이름을 가져 오는 방법을 보여줍니다. "[ts] 인수 'typeof MyType'의 인수를 'new()'유형의 매개 변수에 지정할 수 없기 때문에이 메서드는 일반 매개 변수가 아닙니다. => MyType '. " 또한, 제네릭 메서드 내에서 함수를 사용하면 매개 변수로 T를 사용할 수 없습니다. 즉, 제네릭 타입에서 이름을 가져올 필요가있는 모든 곳에서이 매개 변수를 추가해야합니다. 매개 변수

+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

Answer 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 전문가가 아니지만이 문제를 해결하는 방법을 이해하기 위해 계속 조사 할 것입니다.

편집 : 추가 playground example