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
'prosource' 카테고리의 다른 글
스프링 유효성 검사를 수동으로 트리거하는 방법은 무엇입니까? (0) | 2023.03.19 |
---|---|
표준 시간대에 맞게 조정되는 각도 UI DatePicker (0) | 2023.03.19 |
여러 레이아웃으로 리액트 라우터 v4 (0) | 2023.03.19 |
Typescript에서 인터페이스를 구현할 때 개인 속성을 정의하는 방법은 무엇입니까? (0) | 2023.03.19 |
Vue Axios CORS 정책:'액세스 제어-허용-발신원' 없음 (0) | 2023.03.19 |