2017-03-31 4 views
1

typescript의 특정 설정을 감안할 때 javascript에서 빈 클래스 개체로 런타임에 끝납니다. 설정은 서로 참조하는 2 개의 클래스가 하나의 클래스가 다른 클래스의 범위에서 비어있는 것과 같습니다. 나는 그것을 피하는 방법을 안다. (2의 세 번째 클래스를 도입한다.) 그러나 나는 왜 그것이 일어 났는가에 대해 궁금해하며 여전히 상호 참조를 만들고 여전히 작동 코드를 가지고있는 방법이있다. 나는 그것을 작동하게하려고 수천 톤의 설치를 시도했다. 그래서 여기에 내가 찾은 것이있다.Typescript 클래스 비어 있음

설정 :

//를 ClassA

import ClassB = require('ClassB'); 
import ClassC = require('ClassC'); 

class ClassA 
{ 
    constructor() 
    { 
     console.log(ClassC.TEST);// shows 1 
     new ClassB();// shows null 
     console.log(ClassC.TEST);// shows 1 
    } 
} 
export = ClassA; 

// ClassB가 (다른 모듈)

이 : (모듈 이름과 클래스 이름 무관) 자체 모듈의 각 클래스는 를 ClassA는 우리의 주요 항목입니다
import ClassC = require('ClassC'); 

class ClassB 
{ 
    public static ClassBRef:any; 

    constructor() 
    { 
     console.log(ClassC.TEST);// in this scope ClassC is an empty object with no properties 
    } 
} 
export = ClassB; 

// ClassC

(다른 모듈)

ClassB는 ClassC 및 ClassC 참조를 참조하므로 ClassB는 결과입니다. ClassA 범위 내의 ClassC는 문제없이 존재하지만 ClassB 범위 내에서 ClassC는 런타임에 속성이없는 빈 객체입니다. 다른 말로하면 타이프 스크립트에서는 모든 것이 잘되지만 자바 스크립트에서는 가지지 않을 것입니다. 정적 또는 인스턴스 범위, 생성자 또는 인스턴스 메서드 또는 정적 메서드 등을 사용하여 모듈 이름, 위치, 클래스 이름 변경 등은 아무런 차이가 없으며 ClassB 범위에서 항상 ClassC가 비어 있습니다.

마찬가지로 수정 프로그램은 2 개의 결함이있는 클래스와 통신을 처리하는 세 번째 클래스 (2 클래스 중 적어도 하나는 두 번째 클래스에 대한 참조가 없음)를 가지고 있지만 다시는 내 질문이없이 세 번째 클래스가 필요하고 두 클래스 간의 상호 참조를 제거하지 않아도됩니까?

답변

0

ClassBClassC 사이의 순환 참조가 있습니다. 모든 JavaScript 환경에서 이러한 문제를 해결하는 것은 정말 어렵습니다.

기본적으로 두 가지 시나리오가 있습니다.

ClassBrequired입니다. ClassCrequire d입니다. ClassC 시도는 requireClassB입니다.

ClassB가 아직 빌드되지 않았으므로 (아무 것도 내보내지지 않았으므로)이 경우 정의되지 않습니다. ClassC이 먼저로드되면 반대가 발생할 수 있습니다.

당신이 그것을 해결할 수있는 방법이 있지만 여분의 파일 없이는 "느낀다".

import containerC = require('ClassC'); 
// or import * as containerC from 'ClassC'; in ES6 syntax 

export class ClassB 
{ 
    public static ClassBRef:any; 

    constructor() 
    { 
     console.log(containerC.ClassC.TEST);// in this scope ClassC is an empty object with no properties 
    } 
} 

// ClassC 
import containerB = require('ClassB'); 

export class ClassC 
{ 
    public static TEST:number = 1; 

    constructor() 
    { 
     containerB.ClassB.ClassBRef; 
    } 
} 

필요에 의해 반환되는 값이 시간 중 수업 실행의 constructor에 의해 채워집니다 때문에 가능하다.

export = X 구문을 사용할 수 없으므로 명명 된 내보내기 구문을 사용해야합니다. 또한 모듈이로드 될 때까지 두 클래스 중 하나에 액세스하려고 시도 할 수 없습니다. 따라서 클래스가 반출 된 후에 호출되는 생성자 또는 함수에 있어야합니다.

+0

들으, 나는 것을 시도 할 것이다 다시보고하십시오. –

+0

게시 된 답변은 모두 좋지만 이번에는 내 설정이 실패한 이유에 대한 자세한 설명이 나와 있습니다. 수락 됨. 또 다른 질문은 typescript 컴파일러가 그 설정에 아무런 문제가 없다는 것입니다. 또한 내 typescript 프로젝트가 (다른 언어로) 자동으로 생성되기 때문에 변환 된 코드에서 가장 잘 맞는 세 번째 클래스 브리지 솔루션을 유지할 것입니다. Thx –

0

대신 import ClassC = require('ClassC');

클래스 B의, 클래스를 가져 오기위한 구문 import { ClassC } from "./ClassC";을 사용

import { ClassC } from "./ClassC"; // use this syntax 

class ClassB 
{ 
    public static ClassBRef:any; 

    constructor() 
    { 
     console.log(ClassC.TEST); 
    } 
} 
export { ClassB }; 

클래스 C : 설명에 대한

import { ClassB } from "./ClassB"; // use this syntax 

class ClassC 
{ 
    public static TEST:number = 1; 

    constructor() 
    { 
     ClassB.ClassBRef; 
    } 
} 

export { ClassC }; 
+0

나는 그것을 시도하고 다시보고 할 것입니다. –

+0

모듈을 내보내는 구문에도 유의하십시오. 그것은'export = ClassC' 대신'export {ClassC}'입니다. –