为什么使用 TypeScript ?
TypeScript 和 JavaScript
TypeScript 和 JavaScript(以下分别简称为 TS 和 JS),的关系就像是爸爸和儿子的关系,TS 是基于 JS 的,增加了类型系统。
JS 的代码可以无缝切换到 TS (TS 的类型检查仅用于编译时,运行时是管不到的,但是既然编译时都明确了有问题了,就不要强行编译了)。
而 TS 的代码则无法直接切换到 JS 中,因为 JS 无法识别 TS 的类型系统。(但是可以通过编译为 JS 文件让 TS 代码在 JS 中作用)。
让一切变得已知
我是喜欢使用 TS 的。相对于哪些不知道变量类型,参数类型,不知道返回类型,不知道数据格式的未知。我更喜欢的是通过类型标注使得这一切变得已知。
特别是在多人团队协作开发时,这一切就显得非常重要。
以我目前所在的团队为例,迄今为止,未判空,数据少传,参数给错,变量赋值错误这几项占据了至少八成以上的问题。(以变量赋值错误为例,本来是应该传数据对象的,但是传成了在列表中的索引)。
如果引入了 TS,那么可以避免至少大部分的错误。
至于为什么是大部分而不是全部,因为有 any
类型。顾名思义,它可以表示任意类型,使得类型检查失效。所以 TS 也被调侃为 AnyScript。
此外,维护者也可以直接通过类型标注来查看确认代码作用,而不是翻使用,翻实现来一个个查看。
上手并不复杂
其实简单来说,如果能会 JS,就相当于会了 TS,因为 TS 是基于 JS 的,只是增加了类型系统。
// JS
function computedAddition (n1,n2) {
const n = n1 + n2
return n
}
// TS
function computedAddition (n1: number, n2: number): number {
const n: number = n1 + n2
return n
}
以上分别是一个 JS 和 TS 的计算两数相加的示例。
可以看见,在 JS 的基础上, TS 标注了函数参数类型,函数返回类型,变量类型。
但是实际上一般并不用这么麻烦,除了函数参数会需要标注外,其他的一般并不需要手动标记。
因为 TS 会自动进行类型推导给我们进行类型标注,我们 n
赋值的是 n1 + n2
, 因为它俩都是 number
类型,相加也是 number
,所以常量类型就是 number
。我们返回了 n
,它是 number
类型,所以函数返回值就是 number
。
// TS
interface Data {
id:number
name:string
}
type Fn = (n1: number, n2: number) => Data
const fn: Fn = (n1, n2) => ({
id: n1 + n2,
name: 'example'
})
以上是一个 TS 的类型系统的简单示例,我们定义了一个 Data
接口,Fn
类型,并实现了一个 fn
函数。
TS 逐渐被放弃?
可能有些人会说 TS 不行,什么什么库啊,框架什么的说放弃使用了 TS,改回使用 JS,并加以 JSDoc 进行类型辅助。
关于这一点,首先要有一个前提,就是你的团队成员的平均素质要高。高到可以抹平这个差异。
“人家那是可以直接骑着自行车上路的高手,而不是需要使用辅助轮才能不翻车的菜鸟”。