2017-03-09 47 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