为什么要学TypeScript

2,306 阅读2分钟

TypeScript 也是一门语言, 目的是解决 Javascript 类型系统的问题, TypeScript 大大提高代码的可靠程度

强类型 vs 弱类型 (类型安全)

强类型: 在语言层面限制函数的实参类型必须与行参相同, 弱类型没有此限制 例如:

// 定义行参 name 为 string, 那么调用的时候必须传 string类型的值, 否者编译就不通过
const hello = (name: string) =>  {
  console.log(`Hello, ${name}`)
}

hello('typescript')

变量类型随意改变的特点,不是强弱类型的差异.
在我看来,区别强弱类型的区别是 强类型不允许有随意的隐式类型转换,弱类型是允许的 例如弱类型js:

// 自动将 string类型100 转为数字
console.log('100' - 10) // 90

例如强类型 ts: image.png 在编译阶段就报错了.

静态类型 vs 动态类型 (类型检查)

静态类型, 变量声明过后该类型不允许被修改
动态类型,在运行阶段才确定变量类型, 并且变量类型可以随时变化

let a = 1  // 运行到这才知道 a 为数字
a = 'coffee' // 到这 a又变成了字符串

因为我们可以这样想, 动态语言中,变量是没有类型的, 变量中所存放的值是有类型的

弱类型的问题

  1. 在运行时可能才发现问题
let obj = {};
obj.foo(); // TypeError: obj.foo is not a function

试想一下如果 obj.foo() 放在 一个 settimeout 中 几个小时后执行, 那么问题可能都发现不了在哪. 2. 因为类型不确定导致导致函数功能发生变化

function sum(a, b) {
  return a + b;
}

console.log(sum(100, 200)); // 300
console.log(sum('100', 200)); // 100200
  1. 对象索引器的错误用法
const obj = {}
obj[true] = 100 // 属性名会自动转换为字符串
console.log(obj['true']) // 100

开发中很常见将一个不是字符串的内容作为对象的key, 结果被对象默认转换成了string类型
js就是弱类型语言, 为什么 js 在最初设计的时候不 设计成强类型语言呢? 因为早期 js 应用比较简单, 没有想到 前端会发展到今天, 并且js 是脚本语言, 没有编译阶段

强类型的优势

  1. 强类型代码错误更早暴露, 因为在编译阶段就会发现问题
  2. 强类型代码更智能,编码更准确, 开发工具智能提示对 ts 很友好
  3. 重构更可靠, 修改某个方法名,就会发现所有调用这个方法的文件都会报错, 很方便的定位到问题
  4. 减少了代码层面的不必要的类型判断 弱类型js为了保证是 number 类型, 必须加上一系列的判断
function sum (a, b) {
  if (typeof a !== 'number' || typeof b !== 'number') {
    throw new TypeError('arguments must be a number')
  }

  return a + b
}