2013-03-06 27 views
1

這打字稿:打字稿生成的JavaScript具有如下功能:不是一個函數

export enum UID { 
    FACTORY, 
    ROBOT 
} 

編譯成此javascript:

(function (UID) { 
    UID._map = []; 
    UID._map[0] = "FACTORY"; 
    UID.FACTORY = 0; 
    UID._map[1] = "ROBOT"; 
    UID.ROBOT = 1; 
})(exports.UID || (exports.UID = {})); 
var UID = exports.UID; 

我不得不承認,代碼似乎默默無聞的我,但我相信tsc編譯器知道它在做什麼。不幸的是,JavaScript無法執行。 nodejs抱怨:

(function (UID) {

^ TypeError: object is not a function

at ... 

我做了什麼錯了?

更新: Matt B.解決了這個問題。這是打字稿編譯器中的一個已知錯誤。 tsc在require語句後無法插入分號,這可能會導致奇怪的錯誤。手動將分號添加到我的代碼解決了問題。這裏的鏈接到CodePlex上的問題: http://typescript.codeplex.com/workitem/364

更新2: 對於那些你遇到同樣的錯誤。您可以手動插入缺少的分號,但這不是一個很舒服的解決方案,因爲您必須在每次編譯後執行此操作。我注意到問題只發生在枚舉上。項目中還有很多其他模塊,它們都沒有引起這個錯誤。顯然,類定義並沒有被它前面缺少的分號「傷害」。只要移動你的類定義後面的枚舉定義,錯誤就會消失。這不是足以使枚舉的接口後,因爲接口沒有直接等同,只是由編譯器

+2

這是整個劇本嗎? – Bergi 2013-03-06 16:57:05

+3

第二個')'(在你的錯誤信息中)不應該在那裏:'(function(UID)){'。代碼部分工作正常:http://jsfiddle.net/antisanity/cRNeN/ – canon 2013-03-06 16:59:22

+0

該代碼適用於我。 – Pointy 2013-03-06 17:00:48

回答

6

我認爲這與此處所述的問題相同 - 原因是require()聲明後缺少分號:

Typescript generating javascript that doesn't work

在另一個編譯的文件中是否有這樣的一行?

var UID = require('UID')

如果是的話,儘量在最後添加一個分號:

var UID = require('UID');

這似乎是一個錯誤打字原稿;這裏是錯誤報告(投票!):http://typescript.codeplex.com/workitem/364

+0

是的,解決了這個問題。謝謝您的回答。我在codeplex上也提出了這個問題 – lhk 2013-03-06 17:33:06

+1

如果其他人也希望upvote錯誤報告,這裏的鏈接:http://typescript.codeplex.com/workitem/364 – 2013-03-06 17:33:45

+0

不錯,我會添加鏈接到問題 – lhk 2013-03-06 17:34:30

0

刪除在你的JavaScript,你應該有類似

var exports = exports || {}; 

之前

(function (UID) { 
    UID._map = []; 
    UID._map[0] = "FACTORY"; 
    UID.FACTORY = 0; 
    UID._map[1] = "ROBOT"; 
    UID.ROBOT = 1; 
})(exports.UID || (exports.UID = {})); 
var UID = exports.UID; 
+0

但javascript並不是由我生成的。這是否意味着打字稿編譯器對此錯誤負責? – lhk 2013-03-06 17:22:21

+0

全局的''''參考是本地Node.js環境,不需要聲明。 – Bergi 2013-03-06 17:25:52

0

我想和我有同樣的問題 - 我認爲缺少exports變量應該被用來加載當你做

import XXXX = module("XXXX"); 

產生這個JavaScript模塊的JavaScript代碼來生成:

var XXXX = require("./XXXX") 

,我認爲馬特B.是正確的,問題有require()後缺少分號,即後來食堂的事情了。

一個修復程序是將枚舉聲明的模塊中:

module Test { 

    export enum UID { 
     FACTORY, 
     ROBOT 
    } 

} 

產生:

var test; 
(function (test) { 
    (function (UID) { 
     UID._map = []; 
     UID._map[0] = "FACTORY"; 
     UID.FACTORY = 0; 
     UID._map[1] = "ROBOT"; 
     UID.ROBOT = 1; 
    })(test.UID || (test.UID = {})); 
    var UID = test.UID; 
})(test || (test = {})); 
以這種方式 exports變量不再需要