2012-10-13 3 views
2

다음과 같이 내가 BMW라는 클래스가 BMW.ts에서 정의한 다음과 같이 나는 정의 자동차 및 것 수업을 다른 파일 Thing.ts에서타이프 라이터 내부 모듈 사용

///<reference path="../Thing.ts"/> 

module Entities.Cars { 

    import e = Entities; 

    export class BMW extends Vehicle { 

     public series: string; 

     constructor (model : string, series : string) { 
      super("BMW", model) 
      this.series = series; 
     } 

     drive() { 
      alert("driving a bimmer is a different kind of feeling"); 
     }  

     toString() : string 
     { 
      return this.getName() + " " + this.series + " " + this.getType(); 
     } 
    } 
} 

:

module Entities { 

    // Class 
    export class Thing { 

     private _name: string; 
     private _type: string; 

     // Constructor 
     constructor (public name: string, public type: string) { 
      this._name = name; 
      this._type = type; 
     } 

     getName(): string { return this._name; } 
     setName(name: string) { this._name = name; } 


     getType(): string { return this._type; } 
     setType(name: string) { 
      this._type = name; 
     } 

     toString() : string 
     { 
      return "Entities.Thing";   
     } 
    } 

    export class Vehicle extends Thing { 

     public cargoCapacity: number; 
     public fuelType: string; 
     public owner: string; 

     constructor (make: string, model : string) { 
      super(make, model) 
     } 

     drive() { 
     } 

     toString(): string { 
      return "Entities.Vehicle"; 
     } 
    } 
} 

나는 것와 BMW 타이프 스크립트 파일을 참조 뒤에 다음 코드를 실행하려고 시도 :

var car = new Entities.Cars.BMW("335i", "E90"); 
car.drive(); 

나는 제외를 얻을 수 다음 오류 "Microsoft JScript 런타임 오류 : 'BMW'속성 값을 가져올 수 없습니다 : 개체가 null이거나 정의되지 않았습니다." 생성 된 Javascript for BMW에 오류가 있습니다. 위의 스 니펫에 무엇이 잘못 되었습니까?

답변

6

코드에 아무런 문제가 없으므로 생성 된 javascript 파일의 가져 오기 순서가 잘못되었습니다.

  1. 컴파일러가 올바른을 결정하자

    이 시점에서
    ///<reference path='Things.ts'/> 
    ///<reference path='bmw/BMW.ts'/> 
    var car = new Entities.Cars.BMW("335i", "E90"); 
    car.drive(); 
    

    당신은 두 가지 옵션이 다음과 같이 내가 파일 app.ts을 생성 한

    Initialization order of the source files that make up the global module ultimately depends on the order in which the generated JavaScript files are loaded at run-time (which, for example, may be controlled by tags that reference the generated JavaScript files).

    : 사양은 다음을 말한다 단일 출력 파일을 생성하여 파일을 실행하기위한 순서

    tsc --out app.js app.ts

    그러면 소스는 입니다.

  2. 올바른 순서를 수동으로 지정하십시오. 나를 위해, 다음은 오류를 던지지 않고 작동하는 유일한 순서입니다.

    <html> 
        <head> 
         <script src="Things.js"></script> 
         <script src="bmw/BMW.js"></script> 
         <script src="app.js"></script> 
        </head> 
        <body> 
        </body> 
    </html> 
    
+1

그게 다야, 고마워. app.js에서 Thing.js와 BMW.js를 참조하지 않았습니다. 현재 TypeScript 컴파일러는 다음과 같이 프로젝트 파일에 구성되어 있습니다. . 모든 것을 tsc --out app.js app.ts로 변경합니까? –

+0

은 컴파일러 옵션 -out scripts \ app.js scripts \ app를 전달했습니다.ts 및 모든 코드가 포함 된 단일 자바 스크립트 파일을 참조하십시오. 하지만, 내가 참조하는 것이 app.js라면 엔티티는 정의되지 않은 상태가됩니다 ... –

+0

이전에 어떤 일이 발생했는지 모릅니다. 옵션 1은 현재 잘 작동합니다. 다시 한 번 감사드립니다. –

0

코드는 문제가 없습니다.

제 생각에는 스크립트 요소를 head 요소에 적절하게 삽입하지 않았기 때문입니다 (잘못된 순서 또는 일부 생략).

이 문제를 해결하고 적절한 선언 순서를 기억하지 않아도되는 가장 간단한 방법은 --out 옵션을 설정하여 tsc 컴파일러의 단일 .js 출력 파일을 사용하는 것입니다.

편집 : 작업중인 js 시나리오 (WSH, 웹 응용 프로그램 또는 다른 js 환경)에 따라 js 소스 파일을 다르게 링크해야합니다. 예를 들어 wsh를 사용하면 FileSystemObject를 사용하여 소스 파일을 읽고 평가할 수 있습니다. 또는 AMD를 사용할 수 있습니다 ...

+0

감사합니다. –