2013-08-05 1 views
0

나는 array을 통해 루프를 만들고, 원하는 항목을 잡아려고합니다. 처음에이 작업을 수행했습니다.AMD 로딩을 사용하는 TypeScript로 유형별로 객체 가져 오기

getItemsByType<T>(type: string): T[] { 
    var results: T[] = []; 
    for (var item in this) { 
     if (typeof this[item] === type) { 
      results.push(this[item]); 
     } 
    } 
    return results; 
    } 

그러나 my Foo() 클래스는 typeof 개체로 반환됩니다.

getItemsByType<T>(type: string): T[] { 
    var results: T[] = []; 
    for (var item in this) { 
     if (this[item] instanceof type) { 
      results.push(this[item]); 
     } 
    } 
    return results; 
    } 

그냥 실제 class없이 instanceof을 사용할 수 없습니다 작동하지 않습니다. 그러나 AMD 로더 ( dojo)를 사용하고 있으므로이 외로운 메서드에서 쉽게 액세스 할 수있는 생성자가 없어야합니다.

내 특정 인스턴스에는 해당 정의를 상속하는 많은 클래스가있는 기본 형식의 배열이 있습니다. 그래서 나중에 특정 유형을 가져와야합니다. 이것이 가능하지 않으면 유형별로 저장을 시작해야 할 수도 있습니다.

아이디어가 있으십니까? 감사.

답변

2

TypeScript 유형은 컴파일 과정에서 생존하지 못합니다. 따라서 유형이 지워 지므로 모든 모듈과 클래스가 런타임에 객체가됩니다.

즉, JavaScript to get the name of the object at runtime에 의지해야합니다 (또는 유형을 알려주는 각 클래스마다 속성을 표시해야 함).

아래의 예는 문서의 직접 촬영하고주의 사항은 로컬 이름을 얻을하는 - 당신은 (예를 Module.Module.ClassName 용)의 전체 경로 모르는 :

class Describer { 
    static getName(inputClass) { 
     var funcNameRegex = /function (.{1,})\(/; 
     var results = (funcNameRegex).exec((<any> inputClass).constructor.toString()); 
     return (results && results.length > 1) ? results[1] : ""; 
    } 
} 
class Example { 
} 
class AnotherClass extends Example { 
} 
var x = new Example(); 
var y = new AnotherClass(); 
alert(Describer.getName(x)); // Example 
alert(Describer.getName(y)); // AnotherClass 
0

을 다음과 같이 시도하십시오 :

interface NewableClass { new(); } 

getItemsByType<T extends NewableClass>(type: T): T[] { 
    var results: T[] = []; 
    for (var item in this) { 
     if (this.hasOwnProperty(item) && this[item] instanceof type) { 
      results.push(this[item]); 
     } 
    } 
    return results; 
} 

type은 "newable"이어야한다고 지정합니다.

자바 스크립트에서
getItemsByType<T extends Function>(type: T) 

이 클래스는 다음과 같습니다 유형으로는 Dijit를 사용하는 경우 새 인터페이스를 생성하지 않으려면, 예를 들어, 당신도 할 수있는, xxx.getItemsByType(dijit.form.TextBox);

처럼 사용합니다 정말 기능. LINQ-to-TypeScript 프로젝트에는이 방법으로 정의 된 ofType 메서드가 있습니다.

또한 Dojo를 사용하는 경우 내 Dojo-TypeScript 프로젝트를 확인하십시오. 진행중인 작업이지만 다소 유용합니다.

+0

또한 잊어 버린''hasOwnProperty''에 주목하십시오. 일반적으로이 호출을 "for ... in' 루프 안에 쌍으로 연결하는 것이 좋습니다. –