2017-04-19 5 views
0

I 클래스가있는 경우 : 파일 "BigClass.ts"에서어떻게 실제 수업의 정의를 만들 수 있습니까?

:

class BigClass{ 
    /// a lot of properties and methods here, I mean, a lot 
} 
window['big'] = new BigClass(); 

을 그리고 "Big.d.ts"글로벌 한 선언하고 싶습니다 :

declare let big:BigClass; 

TS는 선언 된 변수를 .d 파일의 인터페이스를 통해서만 정의 할 수 있기 때문에 TS를 사용하지 않을 것입니다.

하지만이 클래스는 매우 커서, 인터페이스를 만들고 싶지 않습니다. 여기서 각 소품과 메소드를 반복 할 것입니다 ... 주위에 방법이 있습니까?

아니면 내가 알지 못하는 기존 클래스를 기반으로 전역 변수를 선언하는 또 다른 방법이 있을까요?

+0

:

//file: BigClass.ts class BigClass{ } interface Window { big: BigClass; } window.big = new BigClass(); 

그리고 모듈은 작업하기 정말 더 좋은이기 때문에, 여기 당신이 모듈이 작업을 수행하는 방법은

은'TSC -d'이 수 '.ts'에서'.dts '를 생성합니다. – Jokester

+0

맞아요,하지만 클래스를 끊임없이 바꾸고 있습니다. 항상 인터페이스를 변경하고 싶지는 않습니다 ... – shal

답변

1

이 작업을 수행하는 방법에 단순히 d.ts 파일에 BigClass.tsdeclare let big:BigClass;을 넣어하지 않습니다. 그것은 완벽하게 합법적입니다.

이것은 BigClass.ts가 모듈이 아니므로 import \ export 문이 없다고 가정합니다. 모듈이 아닌 경우 다른 파일에서도 declare 문을 "보게"됩니다.

그러나 이는 사실 window이 브라우저의 전역 개체 일 뿐이라는 사실을 계기로 악용 사례입니다.

더 나은 방법 : 참고로

//file: BigClass.ts 

export class BigClass{ 
} 
declare global { 
    interface Window { 
    big: BigClass; 
    } 
} 
window.big = new BigClass(); 
+0

불행히도 그것은 나를 위해 작동하지 않습니다. 예,이 클래스는 가져 오기/내보내기를 사용하는 모듈에 있습니다. 나는 선언하기 위해 제공 한 세 가지 메소드를 모두 시도해 보았습니다. 또 다른 .ts 파일은 '이름을 찾을 수 없습니다'라는 문자가 큰데 ... – shal

+1

@shal what about' window.big' 다른 파일에서? (제가 보여준 마지막 방법에 대해 이야기합니다). 또는 글로벌 var를 실제로 사용하려는 경우'declare global {const big : BigClass} '을 사용하십시오. –

+0

이제 완벽하게 작동합니다. 마침내! 나는 여기에 의미없는 "감사합니다"코멘트를 게시해서는 안되지만,이 경우에는 저항 할 수 없다고 생각합니다. :) – shal

0

그리고 "Big.d.ts"글로벌 한 선언하고 싶습니다 :

왜 이렇게 싶습니다를? 이 클래스의 인스턴스를 선언하면 ts는 이미이 클래스에 대한 모든 것을 알게됩니다. 또한 전역 변수를 피하십시오. const big = new BigClass();

+0

글로벌 클래스를 피해야한다는 것을 알고 있지만 거대한 JavaScript 프로젝트를 TS로 거의 전부 번역 중입니다. 번역되었지만 전역 변수를 사용합니다 (너무 많지는 않지만 광범위하게). 좋아, 이제 인터페이스를 생성하고 다른 선택은하지 말아야한다 ... – shal