2016-12-05 2 views
2

두 파일, A.js 및 B.js가 있다고 가정 해 봅시다. 둘 다이 같은 서로에 대한 참조가 필요합니다.모듈에서 가져온 형식 정보 만

A.js

import { B } from "b" 

export class A { 
    constructor(public name: string) {} 
} 

let b = new B(); 
b.print(new A("This is a random name")); 

B.js는

import { A } from "a" 

export class B { 
    print(a: A) { 
    console.log(a.name); 
    } 
} 

위의 예는 현재 내가 사용하고 자바 스크립트 런타임에서 작동하지 않는 순환 참조를 작성합니다. 파일 B.js은 실제로는 실제 반출 오브젝트가 아닌 유형 정보 만 필요합니다. 형식을 A.js에서 정적 형식 검사를 원합니다. 이것이 가능한가?

+0

'class A '를 다른 파일로 옮길 수없고'b.print (...)'를하고 싶을 때 둘 다 가져올 수 없습니까? – Aurora0001

+0

이상인 경우 B의 인터페이스를 다른 파일에 배치하고 두 파일 모두 사용하도록 설정하십시오. – toskv

+0

순환 의존성의 바로 그 정의입니다. 그 의존성을 깨뜨리는 것만으로 ... 'A'가 'B'를 참조해야하는 이유는 없습니다. 나머지 코드는 다른 위치로 옮기십시오. –

답변

2

당신은 가져올 특별한 작업을 수행 할 필요가 없습니다 모듈 a에서.

타이프 라이터가 당신을 위해 그것을 할 것입니다 - 형태 a을 필요로 b 유일한 모듈 정보를 입력하는 경우, 컴파일 된 파일 b.jsrequire("./a") 문이없는 것, 즉이 a에 런타임 의존성이없는 것입니다. typescript handbook로부터 견적 :

컴파일러는 각각의 모듈은 상기 방출 자바 스크립트에서 사용되는지 여부를 검출한다. 모듈 식별자가 주석 유형의 일부로 만 사용되었으며 표현식으로 사용되지 않는 경우 해당 모듈에 대해 이 필요하지 않습니다.

import { A } from './a'; 

export class B { 
    print(a: A) { 
     console.log(a.name); 
    } 
} 

함께

,369 그들을 컴파일

파일 a.ts

import { B } from "./b" 

export class A { 
    constructor(public name: string) {} 
} 

let b = new B(); 
b.print(new A("This is a random name")); 

파일 b.ts :

난 그냥 것을 시도

tsc a.ts b.ts 

결과는 b입니다. b.js :

"use strict"; 
var B = (function() { 
    function B() { 
    } 
    B.prototype.print = function (a) { 
     console.log(a.name); 
    }; 
    return B; 
}()); 
exports.B = B; 

var b_1 = require("./b"); 

대부분의 경우 포함하는 a.js는 달리, 더 require("./a") 없다, 당신은 당신의 질문에 게시 예제 코드가 불완전하고, 실제 b 모듈이 a에 런타임 의존성이 - 그것이 그 없애 곳을 찾아 , 당신은이 문제가 없을 것입니다.

+0

좋은 답변입니다! 나는 이것을 완전히 놓쳤다, 나를 알려줘서 고마워! 나의 "진짜"문제에 대해 나의 모범이 너무 단순하다는 점에서 당신은 맞습니다. – jnsmalm

0

여기 [typescript] 태그를 사용 했으므로 타이프 스크립트를 사용한다고 가정합니다.

편도로 지정하십시오. 순환 종속성을 종료합니다. 아마도이 파일을 1 개의 파일로 옮기 겠지만, 이렇게 분할 할 수는 있습니다. 정보 만 입력

a.ts (단지 인터페이스)

export interface A { 
    name: string; 
    new (name: string); 
} 

b.ts (구현)

import { A } from 'a'; 

export class B implements A { 
    /*...*/ 
} 
+0

클래스를 다른 파일로 이동 (또는 다른 리팩토링)하여 문제를 해결할 수는 있지만이 경우에는 문제가 아닙니다. – jnsmalm

관련 문제