programing

유형 스크립트 - 인터페이스의 모든 구현을 가져옵니다.

firstcheck 2023. 6. 22. 23:46
반응형

유형 스크립트 - 인터페이스의 모든 구현을 가져옵니다.

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

반응형