TypeScript Nodejs 项目结构

目录

1. 新旧交替

新事物代替旧事物无外乎旧事物太陈旧。

JS动态软类型语言,便利的同时也带来了很多弊端,随着项目的增大,加上没有注释,你完全会懵逼。

可以看下网上汇总的错误信息,有多少个是类型错误引起的

15371487615795.jpg

图为rollbar统计的数千个项目中数量最多的前十个异常
而TS在你编写代码的时候,你就可以很直观的看到哪个变量有效、哪个变量重名、哪个变量不可以更改等等
并且提供了多种数据类型,更加面向对象

掘金上有一篇对比JS 与 TS的文章,我摘录一段

1. TypeScript 从核心语言方面和类概念的模塑方面对 JavaScript 对象模型进行扩展。
2. JavaScript 代码可以在无需任何修改的情况下与 TypeScript 一同工作,同时可以使用编译器将 TypeScript 代码转换为 JavaScript。
3. TypeScript 通过类型注解提供编译时的静态类型检查。
4. TypeScript 中的数据要求带有明确的类型,JavaScript不要求。
5. TypeScript 为函数提供了缺省参数值。
6. TypeScript 引入了 JavaScript 中没有的“类”概念。
7. TypeScript 中引入了模块的概念,可以把声明、数据、函数和类封装在模块中。

作为后端开发,也许会被传统的C、C++、Java、C#误以为是前端或小儿科,能干啥大事,

编程语言的鄙视链

asm → C ↔ C++ ↔ Java ↔ C# → JavaScript → VB → VBScript
Common Lisp ↔ Scheme → Emacs Lisp →→ Python
Python ↔ Perl → shell → PHP → all

15371497139971.jpg

除了PHP,我谁都不服

没有调研的鄙视就是耍流氓

金无足赤、人无完人,更何况语言,所以各自发挥自己的优势就好,为啥要鄙视!!!真是的
记得 改天,咱一块diss PHP兄弟 _

当你们都做老板的时候,我一开始身体力行,钱不好赚啊!Node.js : 我只需要一个店小二

2. TypeScript在node中的应用

在TS的官网中,有着大量的示例,其中就找到了Express版本的例子.有兴趣的可以参考一下,我自行更改了一些,目录结构如下

.  
├── build  // 编译文件
├── node_modules  // 模块文件
├── src // 资源文件
│   ├── app.ts // 程序入口
│   ├── config  // 配置文件
│   │   ├── config-local.ts
│   │   ├── config-production.ts
│   │   ├── index.ts  // index 文件
│   ├── controllers // 负责具体的业务模块流程的控制
│   │   ├── index.ts
│   │   └── user.ts
│   ├── daos // 负责与数据库进行联络
│   │   ├── index.ts
│   │   └── user
│   ├── doc // 可以存放一些文件
│   ├── models  // 表映射
│   │   ├── entity
│   │   ├── enum.ts
│   │   └── index.ts
│   ├── router  // 处理接口请求
│   │   ├── index.ts
│   │   └── user.ts
│   ├── routerToken  // 处理接口请求
│   │   ├── basic.ts
│   │   └── index.ts
│   └── utils // 常用模块封装
│       ├── index.ts
│       └── log.ts
├── test // 测试文件
│   └── test.ts
├── views // 视图
├── package.json  
├── tsconfig.json  // TS 配置文件
└── tslint.json // 代码规范

这样做的好粗是啥??送给没有解耦的小伙伴

3. 相应配置

1. MySQL

可以使用sequelize-typescript, 书写中像调用模块一样,可看到数据结构;暂没找到,可以自动导出的脚本,不像Sequlize-auto可以直接导出js文件。如果谁有办法脚本导出,请告我一下,谢啦!!

2. tslint 代码规则

官方 tslint 规则 , 实例如下: 摘录自--TSLint配置小结

{
    "rules": {
        // TS特性
        "member-access": true, // 设置成员对象的访问权限(public,private,protect)
        "member-ordering": [// 设置修饰符顺序
            true,
            {
                "order": [ 
                    "public-static-field",
                    "public-static-method",
                    "protected-static-field",
                    "protected-static-method",
                    "private-static-field",
                    "private-static-method",
                    "public-instance-field",
                    "protected-instance-field",
                    "private-instance-field",
                    "public-constructor",
                    "protected-constructor",
                    "private-constructor",
                    "public-instance-method",
                    "protected-instance-method",
                    "private-instance-method"
                ]
            }
        ],
        "no-empty-interface":true,// 不允许空接口
        "no-parameter-reassignment":true,// 不允许修改方法输入参数
        "prefer-for-of":true,// 如果for循环中没有使用索引,建议是使用for-of

        // 功能特性
        "await-promise":true,// 不允许没有Promise的情况下使用await
        "curly":true,// if/for/do/while强制使用大括号
        "forin":true,// 使用for in语句时,强制进行hasOwnProperty检查
        "no-arg":true,// 不允许使用arguments.callee
        // "no-bitwise":true, // 不允许使用特殊运算符 &, &=, |, |=, ^, ^=, <<, <<=, >>, >>=, >>>, >>>=, ~
        "no-conditional-assignment":true,// do while/for/if/while 语句中将会对例如if(a=b)进行检查
        // "no-console":true,// 不允许使用console对象
        "no-debugger":true,// 不允许使用debugger
        "no-duplicate-super":true,// 不允许super() 两次使用在构造函数中
        "no-empty":true,// 函数体不允许空
        "no-eval":true,// 不允许使用eval
        "no-for-in-array":true,// 不允许对Array使用for-in
        "no-invalid-template-strings":true,// 只允许在模板字符串中使用${
        "no-invalid-this":true,// 不允许在class之外使用this
        "no-null-keyword":true,// 不允许使用null,使用undefined代替null,指代空指针对象
        "no-sparse-arrays":true,// 不允许array中有空元素
        "no-string-throw":true,// 不允许throw一个字符串
        "no-switch-case-fall-through":true,// 不允许case段落中在没有使用breack的情况下,在新启一段case逻辑
        "no-unsafe-finally":true,// 不允许在finally语句中使用return/continue/break/throw
        "no-unused-expression":true,// 不允许使用未使用的表达式
        "no-use-before-declare":true,// 在使用前必须声明
        "no-var-keyword":true,// 不允许使用var
        "radix":true,// parseInt时,必须输入radix精度参数
        "restrict-plus-operands":true,// 不允许自动类型转换,如果已设置不允许使用关键字var该设置无效
        "triple-equals":true,// 必须使用恒等号,进行等于比较
        "use-isnan":true,// 只允许使用isNaN方法检查数字是否有效

        // 维护性功能
        "indent":[true, "spaces", 4],// 每行开始以4个空格符开始
        "linebreak-style":[true,"CR/LF"],// 换行符格式 CR/LF可以通用使用在windows和osx
        "max-classes-per-file":[true,1],// 每个文件中可定义类的个数
        "max-file-line-count":[true,500],// 定义每个文件代码行数
        "max-line-length":[true,120],// 定义每行代码数
        "no-default-export":true,// 禁止使用export default关键字,因为当export对象名称发生变化时,需要修改import中的对象名。https://github.com/palantir/tslint/issues/1182#issue-151780453
        "no-duplicate-imports":true,// 禁止在一个文件内,多次引用同一module

        // 格式
        "align":[true,"parameters","arguments","statements","members","elements"],// 定义对齐风格
        "array-type":[true,"array"],// 建议使用T[]方式声明一个数组对象
        "class-name":true,// 类名以大驼峰格式命名
        "comment-format":[true, "check-space"],// 定义注释格式
        "encoding":true,// 定义编码格式默认utf-8
        "import-spacing":true,// import关键字后加空格
        "interface-name":[true,"always-prefix"],// interface必须以I开头
        "jsdoc-format":true,// 注释基于jsdoc风格
        "new-parens":true,// 调用构造函数时需要用括号
        "no-consecutive-blank-lines":[true,2],// 不允许有空行
        "no-trailing-whitespace": [// 不允许空格结尾
            true,
            "ignore-comments",
            "ignore-jsdoc"
        ],
        "no-unnecessary-initializer":true,// 不允许没有必要的初始化
        "variable-name":[true,"check-format",// 定义变量命名规则
            "allow-leading-underscore",
            "allow-trailing-underscore",
            "ban-keywords"]
    }
}

3. tsconfig.json 配置

首选TypeScript中文网-编译选项

TS 使用 tsconfig.json 作为其配置文件,它主要包含两块内容:

1. 指定待编译的文件
2. 定义编译选项
1. 指定待编译的文件

第一个实例

{
// 配置编译选项
"compilerOptions": {
    "module": "commonjs",
    "noImplicitAny": true,
    "removeComments": true,
    "preserveConstEnums": true,
    "sourceMap": true
  },
// 指定待编译文件
  "include": [
    "src/**/*"
  ],
// 排除待编译文件
  "exclude": [
    "node_modules",
    "**/*.spec.ts"
  ]
}

include 和 exclude 属性是一个数组<也可以用file>,但数组元素是类似 glob 的文件模式。它支持的 glob 通配符包括:

* :匹配 0 或多个字符(注意:不含路径分隔符)
? :匹配任意单个字符(注意:不含路径分隔符)
**/ :递归匹配任何子路径

在继续说明之前,有必要先了解下在编译器眼里什么样的文件才算是 TS 文件

.ts、.tsx 或 .d.ts 的文件。

如果开启了 allowJs 选项,那 .js 和 .jsx 文件也属于 TS 文件。

2. 编译选项

常用选项

选项字段 类型 默认值 说明
allowJs boolean false 允许编译 JS 文件
declaration boolean false 生成对应的 .d.ts 文件
checkJs boolean false 报告 JS 文件中存在的类型错误需要配合 allowJs 使用
declarationDir string - 生成的 .d.ts 文件存放路径默认与 .ts 文件相同
experimentalDecorators boolean false 启用实验功能-ES 装饰器
lib string[] - 编译时引入的 ES 功能库,包括:es5 、es6、es7、dom 等。如果未设置,则默认为: target 为 es5 时: ["dom", "es5", "scripthost"] target 为 es6 时: ["dom", "es6", "dom.iterable", "scripthost"]
module string target === "es3" or "es5" ?"commonjs" : "es6" 生成的模块形式:none、commonjs、amd、system、umd、es6、es2015 或 esnext 只有 amd 和 system 能和 outFile 一起使用 target 为 es5 或更低时可用 es6 和 es2015
noImplicitAny boolean false 存在隐式 any 时抛错
noImplicitReturns boolean false 不存在 return 时抛错
noImplicitThis boolean false this 可能为 any 时抛错
outDir string - 编译生成的文件存放路径默认与 .ts 文件相同
sourceMap boolean false 生成 .map 文件
target string es2017 生成 .js 文件版本

更加完整的请参考: TypeScript中文网-编译选项

更多技术文章,请订阅--IT实战联盟

qrcode_for_gh_bd5521db700f_258.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容