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:
在编译阶段就报错了.
静态类型 vs 动态类型 (类型检查)
静态类型, 变量声明过后该类型不允许被修改
动态类型,在运行阶段才确定变量类型, 并且变量类型可以随时变化
let a = 1 // 运行到这才知道 a 为数字
a = 'coffee' // 到这 a又变成了字符串
因为我们可以这样想, 动态语言中,变量是没有类型的, 变量中所存放的值是有类型的
弱类型的问题
- 在运行时可能才发现问题
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
- 对象索引器的错误用法
const obj = {}
obj[true] = 100 // 属性名会自动转换为字符串
console.log(obj['true']) // 100
开发中很常见将一个不是字符串的内容作为对象的key, 结果被对象默认转换成了string类型
js就是弱类型语言, 为什么 js 在最初设计的时候不 设计成强类型语言呢? 因为早期 js 应用比较简单, 没有想到 前端会发展到今天, 并且js 是脚本语言, 没有编译阶段
强类型的优势
- 强类型代码错误更早暴露, 因为在编译阶段就会发现问题
- 强类型代码更智能,编码更准确, 开发工具智能提示对 ts 很友好
- 重构更可靠, 修改某个方法名,就会发现所有调用这个方法的文件都会报错, 很方便的定位到问题
- 减少了代码层面的不必要的类型判断 弱类型js为了保证是 number 类型, 必须加上一系列的判断
function sum (a, b) {
if (typeof a !== 'number' || typeof b !== 'number') {
throw new TypeError('arguments must be a number')
}
return a + b
}