2012-11-02 68 views
0

節點不喜歡在TypeScript正在生成的JavaScript中的東西,我不明白爲什麼。下面是代碼Typescript生成JavaScript不起作用

Person.ts:

export module Models { 
    export class Person { 
     id: number; 
     firstName: string; 
     lastName: string; 

     constructor(f: string, l: string) { 
      this.firstName = f; 
      this.lastName = l; 
     } 

     public saySomething(): void { 
      console.log("my name is %s %s", this.firstName, this.lastName); 
     } 
    } 
} 

Database.ts:

import P = module("Person"); 

export module Database { 
    export class DB { 
     public findPerson(id: number): P.Models.Person { 
      return new P.Models.Person("a", "b"); 
     } 
    } 
} 

Test.ts:

var D = require("./DB"); 
var db = new D.Database.DB(); 
var p = db.findPerson(123); 
p.saySomething(); 

它編譯罰款倒在Javascript,但有似乎是正在創建的DB.js文件有問題。當我嘗試在節點中運行Test.js時,得到:

$node Test.js 
DB.js:2 
(function (Database) { 
^ 
TypeError: object is not a function 
    at Object.<anonymous> (DB.js:2:1) 
    at Module._compile (module.js:449:26) 
    at Object.Module._extensions..js (module.js:467:10) 
    at Module.load (module.js:356:32) 
    at Function.Module._load (module.js:312:12) 
    at Module.require (module.js:362:17) 
    at require (module.js:378:17) 
    at Object.<anonymous> (Test.js:1:73) 
    at Module._compile (module.js:449:26) 
    at Object.Module._extensions..js (module.js:467:10) 

在導入DB.js期間發生這種情況。奇怪的是,如果我改變findPerson()方法返回一個字符串,而不是一個人,它工作正常。它與創建Person對象有關。

這裏是JavaScript:

(function (Models) { 
    var Person = (function() { 
     function Person(f, l) { 
      this.firstName = f; 
      this.lastName = l; 
     } 
     Person.prototype.saySomething = function() { 
      console.log("my name is %s %s", this.firstName, this.lastName); 
     }; 
     return Person; 
    })(); 
    Models.Person = Person;  
})(exports.Models || (exports.Models = {})); 


var P = require("./Person") 
(function (Database) { 
    var DB = (function() { 
     function DB() { } 
     DB.prototype.findPerson = function (id) { 
      return new P.Models.Person("a", "b"); 
     }; 
     return DB; 
    })(); 
    Database.DB = DB;  
})(exports.Database || (exports.Database = {})); 


var dbx = require("./DB") 
var db1 = new dbx.Database.DB(); 
var p = db1.findPerson(123); 
p.saySomething(); 

回答

4

沒有分號之後變種P =要求( 「./人」)的JavaScript比下一認爲(......)是一種功能呼叫。但是你似乎已經在Database.ts中使用它,所以Typescript可能會在編譯時失去一些分號。

+0

哇,你是絕對正確的。 DB.js文件中缺少的分號是導致問題的原因。我想我應該向微軟提交一個錯誤。 – d512

+0

看起來像某人已經做了;只是把它投票:http://typescript.codeplex.com/workitem/364 –

+0

或者,也許這就是你,哈哈......剛注意到這個答案是從十一月。 –

0

主要問題是您正在導入一個名爲Person的模塊,我認爲您的意思是導入Models模塊,該模塊包含一個名爲Person的類。

當您針對nodejs或其他CommonJS平臺時,您可以省略模塊聲明。

您還可以利用構造函數中的自動屬性。

所以你會Models.ts

export class Person { 
    id: number; 

    constructor (public firstName: string, public lastName: string) { 

    } 

    public saySomething(): void { 
     console.log("my name is %s %s", this.firstName, this.lastName); 
    } 
} 

而且Database.ts

import models = module("Models"); 

export class DB { 
    public findPerson(id: number): models.Person { 
     return new models.Person("a", "b"); 
    } 
} 
+0

也許我沒有正確理解模塊背後的概念,但我試圖做的是使用module關鍵字將相關的類組合在一起。因此,我將在「Models」模塊下具有Person,Car,Dog類,並在「Database」模塊下具有Query,Table,Recordset。基本上使用像「C#」命名空間這樣的「模塊」關鍵字。我可以做你想說的,但是我必須把我所有的模型類放在一個巨大的文件中,我不想這樣做。 – d512

+0

您仍然可以在CommonJS中執行類似操作 - 您可以使用嵌套文件夾結構來創建「./Models/Person」模塊,「./Models/Animal」模塊等。 Person.ts和Animal.ts是固有模塊,但您可以從中導出類,並將它們分組到模型名稱空間中。 – Fenton