Skip to content

Instantly share code, notes, and snippets.

@Misaka-0x447f
Created May 14, 2019 07:10
Show Gist options
  • Save Misaka-0x447f/47c035985325b57bf1ecaa06cff6b123 to your computer and use it in GitHub Desktop.
Save Misaka-0x447f/47c035985325b57bf1ecaa06cff6b123 to your computer and use it in GitHub Desktop.

技术选型说明文档

个人建议的技术

个人建议在本项目中使用的技术有:

  • Vue2
    • vue-router
    • 使用TypeScript构建的状态管理器和事件管理器
  • TypeScript3
  • Stylish
  • pug
  • npm

技术选型的实现

https://github.com/Misaka-0x447f/vue-typescript-stylus-template 拿来改改就能用。TRPGServer就是基于这套模板的,它现在在 trpg.misaka.org 工作的很好。

对于TypeScript的顾虑

目前,我们对于TypeScript的顾虑主要是有以下几点:

  • TypeScript是什么?是成熟的新技术吗?它和linter有何区别?
  • TypeScript过于复杂,以至于不应该在本项目中出现
  • TypeScript上手难度大
  • TypeScript将限制项目的自由度 我将主要挑选一些文章来证明这些观点。文章引用如下:
  1. 别骗自己了,你不用 TypeScript 的理由站不住脚
  2. 随着 JavaScript 越来越完善,还有必要学习 TypeScript 吗? 其中一些来源可能并不是可靠来源(比如知乎),如果有疑问的话再说。

TypeScript是什么?TypeScript不是什么?

首先,TypeScript并不是一个linter(就像ESLint)或者转译器(就像babel)那样。
TypeScript 是基于ES6标准的、为JavaScript添加类型系统的一个实用工具。我们可以用它来为JavaScript添加静态类型检查,并借此预防一些linter不能预防的bug。

Linter能够修正的错误和TypeScript能够修正的错误有什么区别?

Linter能够修正的错误主要限于开发者使用了一些不安全的运算,例如JS中的值等于==和逻辑等于===。我们知道,使用值等于是非常不安全的,Linter能够预防这一点,TypeScript不能。
而TypeScript能够修正的错误限于接口调用错误、类型错误等。比如说,【2】中的“小菜刀”的答案:

console.log('index', index); // output is 1

for (var i = index; i <= 2; i++) {
    console.log("i", i);
} 
/* two lines printed from the inside console.log, result:
 * i 1
 * i 2
 */

for (var i = index + 1; i <= 2; i++) {
    console.log("i", i);
} 
/* nothing printed from the inside console.log */

这段代码如果我们有TypeScript,就会直接报错。不然,因为变量index是string “1”,而不是number 1。 "1"+1 = "11","11" < 2 是false。
除此以外,我们可能会在实际使用过程中调用一些接口,例如某接口仅接受{status: true}或者{status: false}这样的一个传入,那么我们就可以写以下TypeScript来约束对于此接口的调用:

interface API {
  status: boolean;
}

export const func = (param: API) => {
  ......
}

这样一来,你就能够限制接口传入的值,而在javascript中,我们要写很多的静态检查来实现这一点:

function func(param) {
  if (typeof param !== "object") {
    throw new Error...
  }
  if (param.status === undefined) {
    throw new Error...
  }
}

而这些检查TypeScript都可以帮你搞定。因此个人认为引入TS是值得的,还有一个例子是https://gist.github.com/Misaka-0x447f/b274f9e7e7a8cff89e2ad324d9dd22a0 ,在此不再赘述,篇幅够长了。

TypeScript真的太过高级以至于不适用于本项目吗?

我认为是否定的。
第一,本项目的复杂度可能高过大家的预期。我们最开始用jquery就是因为我们觉得该项目的复杂度其实是不高的,但是我们都看到结果了。那么我们现在讨论是否要应用TypeScript,我个人认为我们以后是一定会用到EventEmitter和StatusManager的,那么如果有像是这个gist中给出的有TypeScript加持的EventEmitter,开发应该能减少很多压力。 当然,这不意味着不使用TypeScript就不能在此项目上工作了。也许在项目初期,我们不会体会到特别多TypeScript带来的益处,但是当项目遇到重构等需求时,TS就会变得有用。 另外,TS其实是具备代替API文档成为另一个文档的能力的,详见https://github.com/Misaka-0x447f/TRPGServer/tree/master/bridge ,这个项目里TypeScript即是文档。

但是会TypeScript的人太少

完整的观点如下

我们项目中目前会TypeScript的只有你一个人而已。如果你离职了,新来的人就很难接手,这样会导致项目无以为继。

那么对于该观点的解释如下: TypeScript其实非常容易上手。参见【1】中的第一个理由,

  1. 学习曲线过于陡峭

其实并不是这样的,TypeScript相对于JavaScript只是增加了类型系统而已。参考【2】中的第二个答案:

当然没必要学……因为随便看看就会了。 如果你有 Java/C# 基础,两小时内还到不了初级水平(能写中等以上规模的程序,基本不用 any,不需要懂生僻特性)就算我输。

如果新人无论如何都学不会TypeScript怎么办?

事实上,你可以继续写JavaScript,TypeScript是ES6的超集,所以你大可不必写一个变量的类型,只要关闭tslint,就随你写了。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment