2015-10-05 10 views
1

我覺得我做的導入/導出不正確,因爲我拿不出打字稿編譯器錯誤,但得到一個運行時錯誤嘗試從另一個文件中引用我的ActivityType類。打字稿import語句被評估爲NULL在運行時用的node.js

import Activities = require('../models/Activities'); 
import ActivityType = Activities.ActivityType; 

export class Experience extends BaseModel { 

     static save(experience:Experience) { 
      console.log(ActivityType.created) //this throws an error saying ActivityType is null 
      experience.validate(); 
     } 
} 

和在models/Activities.ts

錯誤調用Experience.save()當發生

export class ActivityType { 
    static created = 'created'; 
    static updated = 'updated'; 
    static commented = 'commented'; 
    static uploaded = 'uploaded'; 
    static joined = 'joined'; 
    static followed = 'followed'; 
    static chat = 'chat'; 
} 

我嘗試包裹在Activities.ts出口語句在module塊爲好,例如

module Activities { 
    export class ActivityType { 
    static created = 'created'; 
    static updated = 'updated'; 
    static commented = 'commented'; 
    static uploaded = 'uploaded'; 
    static joined = 'joined'; 
    static followed = 'followed'; 
    static chat = 'chat'; 
    } 
} 

但後來給我在輸入語句中的Typescript錯誤。

回答

0

我想不出理由,爲什麼ActivityType將null - 這通常需要顯式設置。我甚至不確定ActivityType如何根據您提供的代碼來定義。

一個猜測是,你可能會得到一個錯誤Cannot read property 'prototype' of undefined。如果是這樣,您可能會追逐錯誤的東西,並且實際上遇到了關於使用extends關鍵字的亂序問題。如果您有一個基類和一個將其擴展到同一個TypeScript文件中的類,則基類必須排在第一位。

型號/ Activities.ts

export class ActivityType { 
    static created = 'created'; 
    // etc... 
} 

console.log("Activities loaded"); 

碼/ test.ts

import Activities = require('../models/Activities'); 
// Using the import keyword doesn't change the emit, so this 
// could just be var here. 
import ActivityType = Activities.ActivityType; 

class BaseModel { 
    public thing = "hi"; 
} 

export class Experience extends BaseModel { 
    static save(experience:Experience) { 
     console.log(ActivityType.created) 
    } 
} 

const ex = new Experience(); 

Experience.save(ex); 

如果切換:

編譯到ES5和CommonJS的時,該代碼應工作申報的訂單爲BaseModelExperience,它將與TypeScript一起工作,但在運行時失敗。

如果不是的話,請提供一些更多的發射代碼。例如,BaseModel如何/在哪裏聲明?

+0

了一下週圍挖越看起來就像是一個誤導性的錯誤,是一個循環依賴。 My Experience類導入ActivityType,ActivityType導入Experience。從Activites.ts註釋掉參考和調用Experience可以正確解析錯誤消息並不表示它是循環依賴項,並且沒有ca編譯時錯誤 – MonkeyBonkey