prosource

TypeScript 함수에서 클래스를 반환하려면 어떻게 해야 합니까?

probook 2023. 3. 19. 18:20
반응형

TypeScript 함수에서 클래스를 반환하려면 어떻게 해야 합니까?

저는 TypeScript를 Angular 1과 매우 유사한 의존성 주입 라이브러리와 함께 사용하고 있습니다.기본적으로: 의존성을 인수로 하여 팩토리를 등록합니다.

ES6에 등록하는 방법은 다음과 같습니다.

export let factory = () => {
    return class Foo {}
};

TypeScript 에 같은 내용을 쓰는 경우:

export let factory = () => {
    return class Foo {}
};

에러와 함께 컴파일 할 수 없다.

오류 TS4025: 내보낸 변수 'factory'에 개인 이름 'Foo'가 있거나 사용되고 있습니다.

TypeScript가 공장 함수에서 클래스를 반환할 수 있는 방법이 있습니까?

퀵 앤서

변경:

export let factory = () => {
    return class Foo {}
};

다음과 같이 입력합니다.

export let factory = () : any => {
    return class Foo {}
};

더 긴 답변

오류는 tsconfig.json 설정에 의해 트리거/강제적으로 발생할 수 있습니다.

{
    "compilerOptions": {
        ...
        "declaration": true // this should be false or omitted

하지만 그건 이유가 아니라 단지 촉발제일 뿐이야.진짜 이유(여기서 설명한 와 같이 클래스를 반환하는 함수를 내보낼오류 발생: 내보낸 변수에는 개인 이름이 있거나 개인 이름이 사용되고 있습니다.)는 Typescript 컴파일러에서 가져옵니다.

TS 컴파일러가 다음과 같은 스테이트먼트를 발견했을 때

let factory = () => { ...

반환 유형이 무엇인지 추측하기 시작해야 합니다. 이 정보는 누락되어 있기 때문입니다(플레이스 홀더 확인).

let factory = () : <returnType> => { ...

우리의 경우, TS는 빠르게 발견될 것입니다.type추측이 쉽지 않다.

return class Foo {} // this is returned value, 
                    // that could be treated as a return type of the factory method

따라서 이와 유사한 스테이트먼트가 있는 경우(이것원래 스테이트먼트 전혀 동일하지 않습니다.다만, 이 스테이트먼트가 어떻게 되는지를 명확하게 하기 위한 예로서 사용해 봅시다)에는, 다음과 같이 적절히 반환 타입을 선언할 수 있습니다.

export class Foo {} // Foo is exported
export let factory = () : Foo => { // it could be return type of export function
    return Foo
};

클래스는 외부 세계에 보여지기 때문에 이 접근방식은 효과가 있을 것입니다.

우리 사건으로 돌아가자.우리는 수출되지 않은 타입을 반품하고 싶습니다.다음으로 TS 컴파일러가 반환 타입을 결정할 수 있도록 도와야 합니다.

다음과 같이 명시할 수 있습니다.

export let factory = () : any => {
    return class Foo {}
};

하지만 더 좋은 것은 공공 인터페이스를 가지고 있는 것이다.

export interface IFoo {}

다음으로 리턴 타입과 같은 인터페이스를 사용합니다.

export let factory = () : IFoo => {
    return class Foo implements IFoo {}
};

오래된 질문에 대한 늦은 답변:

출고 시 메서드 외부에서 클래스를 정의하고 'typeof'를 사용하여 반환 값을 정의해야 합니다.

class Foo {}

export const factory = (): typeof Foo => {
    return Foo;
};

적절한 방법이라고 생각합니다.

export let factory = () => {
     class Foo {/* ... */}
     return Foo as (new () => { [key in keyof Foo]: Foo[key] })
};

놀이터에서 확인하세요.

메서드의 소비자가 유형에 액세스할 수 있도록 클래스도 내보내야 합니다.

일반적으로 공장에서는 클래스나 컨스트럭터가 아닌 인스턴스를 반환합니다.

갱신된 예

export class Foo {}; 

export let factory = () => {
    return Foo;
};

ES6에서는 클래스 유형을 내보낼 필요가 없지만 TypeScript에서는 반드시 유형 서명을 내보내야 합니다.

다음과 같은 사항을 충족하는 솔루션을 별도로 제공했습니다.

export class MyClass {
   ...
}

export type MyClassRef = new (...args: any) => MyClass;

Given that signature I can use 그 서명이 있으면MyClassRef반환 값을 입력합니다.반환값 유형:

exposeMyClass(): MyClassRef {
    return MyClass;
}

나는 같은 오류로 고생하고 있었다.제 해결책은 이 장치를 제거하는 것이었습니다.

"declaration": true

부에서tsconfig.json or to set it to 또는 로 설정한다.false.

함수에서 Type of class를 반환하시겠습니까?다음은 다른 언어에서와 마찬가지로 TypeScript에서 팩토리를 구현하는 코드 조각입니다.

    class Greeter {
    greeting: string;
    constructor(message: string) {
        this.greeting = message;
    }
    greet() {
        return "Hello, " + this.greeting;
    }
}
class Factory{
    getObject(msg:string): Greeter {
        return new Greeter(msg);
    }
}
var greeter = new Factory().getObject("Hi");
console.log(greeter.greet());

언급URL : https://stackoverflow.com/questions/35314114/how-can-i-return-a-class-from-a-typescript-function

반응형