유형 스크립트 - 인터페이스의 모든 구현을 가져옵니다.
Typescript에서 특정 인터페이스를 구현하는 모든 클래스의 목록을 가져올 방법을 찾고 있습니다.
예를 들어 .Net에서는 반사를 사용하여 이 작업을 수행할 수 있지만 유형 스크립트에서는 동일한 작업을 수행하는 데 대한 정보를 찾을 수 없습니다.
수행할 작업의 코드 예:
interface IControlPanel { }
class BasicControlPanel implements IControlPanel { }
class AdvancedControlPanel implements IControlPanel { }
window.onload = () =>
{
var controlPanels = IControlPanel.GetImplementations();
for (var x = 0; x < controlPanels.length; x++)
{
document.write(controlPanels[x] + ", "); //outputs: BasicControlPanel, AdvancedControlPanel,
}
};
물론 수업이 인스턴스화하기 쉽다면 훨씬 더 좋을 것입니다.
제가 댓글에서 언급했듯이, 타입스크립트(non-goal #5 참조)가 타입 시스템에 의존하는 자바스크립트를 내보내는 것은 명시된 비목표이므로, 런타임에 원하는 것을 하기 위해 자동으로 사용할 수 있는 것은 없을 것입니다.
물론 TypeScript를 사용하여 원하는 대로 거의 정확하게 사용할 수 있는 유형 레지스트리를 유지 관리할 수 있습니다.저는 다음과 같은 클래스 장식가를 사용할 것을 제안합니다.
interface IControlPanel {
// add some methods or something to distinguish from {}
doAThing(): void;
}
// add a registry of the type you expect
namespace IControlPanel {
type Constructor<T> = {
new(...args: any[]): T;
readonly prototype: T;
}
const implementations: Constructor<IControlPanel>[] = [];
export function GetImplementations(): Constructor<IControlPanel>[] {
return implementations;
}
export function register<T extends Constructor<IControlPanel>>(ctor: T) {
implementations.push(ctor);
return ctor;
}
}
자, 이제 수업을 시작하는 대신에implements IControlPanel
당신이 사용하는@IControlPanel.register
:
@IControlPanel.register
class BasicControlPanel {
doAThing() { }
}
@IControlPanel.register
class AdvancedControlPanel {
doAThing() { }
}
구현되지 않은 클래스를 등록하려고 하는 경우IControlPanel
오류가 발생합니다.
// error, doAThing is missing from BadControlPanel
@IControlPanel.register
class BadControlPanel {
doNothing() { }
}
이제 레지스트리를 원하는 방식으로 사용할 수 있습니다.
window.onload = () => {
var controlPanels = IControlPanel.GetImplementations();
for (var x = 0; x < controlPanels.length; x++) {
document.write(controlPanels[x].name + ", ");
const panel = new controlPanels[x]();
panel.doAThing();
}
};
제가 "대부분"이라고 말하는 이유는 당신이 그것들을 인스턴스화하는 방법을 원했기 때문이지, 문자열이 아닌 생성자를 저장했기 때문입니다.다음 정보를 얻을 수 있습니다.name
문자열에 대한 생성자의 속성입니다.그리고 클래스가 모두 동일한 생성자 인수 유형을 사용한다고 가정하여 인스턴스화할 수 있습니다.
도움이 되길 바랍니다; 행운을 빕니다!
언급URL : https://stackoverflow.com/questions/47082026/typescript-get-all-implementations-of-interface
'programing' 카테고리의 다른 글
간격을 분으로 변환 (0) | 2023.06.22 |
---|---|
MongoDB의 기존 필드 끝에 문자열 추가 (0) | 2023.06.22 |
TS 오류:'string' 형식이 배열 형식이나 문자열 형식이 아닙니다.어떻게 끈이 끈이 아닌가요? (0) | 2023.06.22 |
BIT 열의 MAX 값 가져오기 (0) | 2023.06.22 |
스프링 부트 기본 메모리 설정은 무엇입니까? (0) | 2023.06.22 |