2017-03-09 70 views
0

我有一個動態構建的JavaScript對象,包含我的應用程序的資源(翻譯字符串)。它看起來如下:在打字稿中使用javascript

var ResourceManager = (function() { 
    function ResourceManager() { 
     var currentLanguage = $('#activeLanguage').html(); 
     this.resources = { 
      get Aanmelden() { 
       switch (currentLanguage) { 
       case "en-GB": 
        return "Register"; 
       case "nl-NL": 
        return "Aanmelden"; 
       default: 
        return "Aanmelden"; 
       } 
      }, 
      get AlgemeenOpslaan() { 
       switch (currentLanguage) { 
        case "en-GB": 
         return "Save"; 
        case "nl-NL": 
         return "Opslaan"; 
        default: 
         return "Opslaan"; 
       } 
      } 
     }; 

    } 
    return ResourceManager; 
}()); 

整潔的事情是,這樣我可以使用智能感知找到我的翻譯,就像通過MVC提供的功能。當我在打字稿中工作時,有沒有辦法提供相同的功能?這裏的主要問題是,我可以這樣做:

declare class ResourceManager { 

} 

但是,這並沒有給我這個類的方法intellisense。我使用JavaScript而不打字的原因是因爲如果我動態構建一個打字稿文件,它似乎不會自動編譯到我想發送給客戶端的JavaScript文件。

有誰知道要麼通過打字稿資源文件而不是javascript來解決此問題的方法,或者讓我的其他打字稿文件與javascript對象上的intellisense一起工作?

回答

1

TypeScript中的代碼

我不確定需要什麼。也許這種代碼?

class ResourceManager { 
    private currentLanguage: string; 
    constructor() { 
     this.currentLanguage = $('#activeLanguage').html(); 
    } 
    public resources = { 
     get Aanmelden() { 
      switch (this.currentLanguage) { 
       case "en-GB": 
        return "Register"; 
       case "nl-NL": 
       default: 
        return "Aanmelden"; 
      } 
     }, 
     get AlgemeenOpslaan() { 
      switch (this.currentLanguage) { 
       case "en-GB": 
        return "Save"; 
       case "nl-NL": 
       default: 
        return "Opslaan"; 
      } 
     } 
    } 
} 

注意:您可以撥打call the TypeScript compiler programmatically

或現有對象

interface Resources { 
    readonly Aanmelden: string 
    readonly AlgemeenOpslaan: string 
} 

declare class ResourceManager { 
    resources: Resources 
} 

聲明它也是在單獨的文件一個優雅的解決輸出的聲明和數據(代碼)。您可以:

  1. 生成接口的TypeScript定義Resources;
  2. 以JSON格式生成數據;
  3. 寫一次JS代碼(在TS的幫助下),從JSON數據動態構建resources屬性和Object.defineProperties

此外,這種構建過程可以幫助發佈和使用工作作爲npm包。

+0

這確實給了我intellisense,但現在每次添加一個新的資源時,我也需要添加一個屬性到接口。這聽起來很愚蠢,但我可以建立一個ts文件和一個js文件。我猜測,只用於智能感知和ts文件發送到客戶端。 請注意,問題是我似乎無法以編程方式構建打印稿文件,然後進行編譯,因此它在我的請求中包含爲js。 – Kai

+0

@Kai NB:您可以[以編程方式調用TypeScript編譯器](https://github.com/Microsoft/TypeScript/wiki/Using-the-Compiler-API#a-simple-transform-function)。我編輯添加鏈接的答案。 – Paleo