"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文件如下:{ "1001": { "id": 1001, "name": "技能1" }, "1002": { "id": 1002, "skillName": "技能2" }}实现方法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,所以函数返回的是一个字符串类型的值。
除了函数,泛型还可以用于类和接口的定义中。在实际编程中,使用泛型可以使代码更加灵活、可扩展和易于维护。