"1001" : { "id" : 1001 , "name" : "技能1" } , "1002" : { "id" : 1002 , "skillName" : "技能2" }
class ConfigManager{
    public static GetConfigByKey(tableName: string, key: number): any{

这种方法接口调用:

let cfg = ConfigManager.GetConfigByKey("TestCfg_json", 1001);

cfg.xxx不会有任何提示。我们也看不到这个table有哪些属性,这就跟很烦了。

查了查Ts是支持泛型的,于是有了下面的想法:

配置表类,做成强类型,写好注释。。

interface IConfig{
    createByTuple(table:any);
 * 测试配置表
class TestCfg implements IConfig {
    /**这是id */
    public id: number;
    /**这是名字 */
    public name: string;
    createByTuple(jsonTable:any){
        this.id = jsonTable.id;
        this.name = jsonTable.name;

按照C#的语法大抵应该是这个样子了:

var testCfg = ConfigManager.GetConfigByKey<TestCfg>(1001);

然而语法很蛋疼,c#中传入泛型T是可以直接typeof(T)拿到类名称来做key,文件名直接通过传入的泛型参数计算得到,Ts却不行。查阅资料后得到解决方案。

在泛型中使用类类型语法如下

function create<T>(c: {new(): T; }): T {
    return new c();
let configName: string = tType["name"];

这下问题解决!

完整代码如下:

* ConfigManager.ts * @author l2xin class ConfigManager{ private static m_allCfgDict = {}; * 读取某个表中某一行的数据 * @param tType T类 * @param key 下标 * @example let testCfg:TestCfg = GetConfigByKey<TestCfg>(TestCfg, 1001); public static GetConfigByKey<T extends IConfig>(tType: {new(): T}, key: number): T { let table = ConfigManager.GetAllConfig<T>(tType); if (table == null) return null; let result = table[String(key)]; return result; * 读取某个表中所有数据 * @param tType T类 * @return * @example let allTestCfg = GetAllConfig<TestCfg>(TestCfg); public static GetAllConfig<T extends IConfig>(tType: {new(): T}) :{[id: string]: T }{ let configName: string = tType["name"]; if(this.m_allCfgDict[configName] == null){ //加载单张表 用到再加载 this.m_allCfgDict[configName] = {}; let jsonTable = RES.getRes(configName + "_json"); if (jsonTable != null) { for(let key in jsonTable){ let oneCfg = new tType(); oneCfg.createByTuple(jsonTable[key]); this.m_allCfgDict[configName][key] = oneCfg; return this.m_allCfgDict[configName];

配置表文件 自动生成

* 所有配置表的类定义 * @warning 自动生成 请勿手动修改 * @author l2xin interface IConfig{ createByTuple(table:any); * 测试配置表 class TestCfg implements IConfig { /**这是id */ public id: number; /**这是名字 */ public name: string; createByTuple(jsonTable:any){ this.id = jsonTable.id; this.name = jsonTable.name; * 测试技能配置表 class SkillCfg implements IConfig { /**这是id */ public id: number; /**这是名字 */ public skillName: string; createByTuple(jsonTable:any){ this.id = jsonTable.id; this.skillName = jsonTable.skillName;
private testLoadConfig(){
    let allTestCfg = ConfigManager.GetAllConfig<TestCfg>(TestCfg);
    for(let key in allTestCfg){
        let testCfg = allTestCfg[key];
        console.log(`GetAllConfig id:${testCfg.id} name:${testCfg.name}`);
    let testCfg = ConfigManager.GetConfigByKey<TestCfg>(TestCfg, 1001);
    if(testCfg != null){
        console.log(`GetConfigByKey id:${testCfg.id} name:${testCfg.name}`);
    let allSkillCfg = ConfigManager.GetAllConfig<SkillCfg>(SkillCfg);
    for(let key in allSkillCfg){
        let skillCfg = allSkillCfg[key];
        console.log(`GetAllConfig  SkillCfg id:${skillCfg.id} skillName:${skillCfg.skillName}`);
GetAllConfig id:1001 name:白龙驹1 
GetAllConfig id:1002 name:白龙驹2  
GetConfigByKey id:1001 name:白龙驹1 
GetAllConfig  SkillCfg id:1001 skillName:技能1 
GetAllConfig  SkillCfg id:1002 skillName:技能2     
 

折腾折腾又半夜了,代码上传到github,睡觉.
https://github.com/l2xin/EgretConfigManager

前言刚开始用TypeScript,工作中可能要用到类似下面这样的json配置。TestCfg.json文件如下:{ &quot;1001&quot;: { &quot;id&quot;: 1001, &quot;name&quot;: &quot;技能1&quot; }, &quot;1002&quot;: { &quot;id&quot;: 1002, &quot;skillName&quot;: &quot;技能2&quot; }}实现方法1class ConfigManager{ 使用npm install typescript-json-schema -g 从打字稿类型生成模式: typescript-json-schema project/directory/tsconfig.json TYPE 为了产生只有某些类型的文件中tsconfig.json与指定的文件名或水珠--include选项。 这对于大型项目尤其有用。 如果您的项目没有可用的tsconfig.json则可以直接指定.ts文件(在这种情况下,我们使用一些内置的编译器预设): 从打字稿类型生成模式: typescrip files: 数组类型,用于示由 ts 管理的文件的具体文件路径 exclude: 数组类型,用于示 ts 排除的文件(2.0 以上支持 Glob) include: 数组类型,用于示 ts 管理的文件(2.0 以上) compileOnSave: 布尔类型,用于 IDE 保存时是否生成编译后的文件 extends: 字符串类型,用于继承 ts 配置, 二:路径设置,相对路径、绝对路径怎么引入,因为路径不正确肯定会提示找不到模块 三:为什么 var data = require(‘/sandbox/project/sync/name.json’) var tmp = JSON.parse(data); 执行时总报Unexpected token o in JSON at
这是我在知乎问题 Typescript有什么冷门但是很好用的特性? 的回答。 Node.js 模块是允许直接导入 JSON 文件的,但是 ES Module 现在还不支持,TS 在 2.9 (18年5月17日还未发布)之前也不支持。日常中使用 JSON 最多的场景就是 配置文件了,如果要使用的话需要使用下面一些 trick 来支持。 这里有个 JSON 文件 "//": "student....
文件描述符: 文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。 按照惯例,UNIX shell 使用文件描述符0与进程的标准输入结合,文件描述符1与标准输出结合,文件描述符2与标准错误输出结合。 STDIN_FILENO、STDOUT_F
TypeScript中的泛型是指一种能够将类型作为参数进行传递的特性。泛型可以帮助我们编写更加通用的代码,因为我们可以在函数、类和接口中使用它来适应各种不同的数据类型。通过使用泛型,我们可以减少代码的冗余,并提高代码的可读性和可维护性。 在TypeScript中,我们可以使用<>符号来定义泛型类型参数,例如: ```typescript function identity<T>(arg: T): T { return arg; let output = identity<string>("hello world"); 在上面的代码中,identity函数使用了泛型类型参数T,这样我们就可以将任意类型的值传递给这个函数。在这里,我们将泛型类型参数指定为string,所以函数返回的是一个字符串类型的值。 除了函数,泛型还可以用于类和接口的定义中。在实际编程中,使用泛型可以使代码更加灵活、可扩展和易于维护。