强类型与弱类型(类型安全)
强类型在语言层面限制函数的实参类型必须与形参类型相同;强类型语言中不允许有任意的数据隐式类型转换,但弱类型相反。
变量类型允许随时改变的特点,不是强弱类型的差异。
静态类型与动态类型(类型检查)
静态类型:一个变量声明时它的类型就是明确的,声明过后它的类型就不允许再修改。
动态类型:运行阶段才能够明确变量类型,而且变量的类型可以随时发生变化。
JavaScript自有类型系统的问题
弱类型的问题
- 由于js是脚本语言不存在编译环节,如果存在变量类型错误那么只有在运行时才会报错,如果存在耗时长的异步任务,那么这个错误很可能就会被忽略掉成为隐患;
- 多人协同开发时很可能会传递错误的参数类型出现bug,由于类型不明确就会造成函数功能发生改变;
- 出现对对象索引器错误的用法。
强类型的优势
- 错误更早暴露;
- 代码更智能,编码更准确;
- 重构更牢靠;
- 减少不必要的类型判断。
Flow静态类型检查方案
可以在变量后面增加: type
对变量进行类型注解。
-
使用步骤:
- 添加flow-bin;
- 在需要使用flow进行类型检查的文件头部增加如下注释标记;
//@flow
- 为变量添加类型注解。
-
Flow编译移除注解
- 安装flow-remove-types
- 安装bable/core bable/cli babel/preset-flow
Flow开发工具插件
Flow Language SupportFlow类型推断
根据代码使用情况推断变量的类型。Flow类型注解
除了对函数参数进行类型注解外,还可以对变量和函数返回值类型进行类型注解。在括号后加上: type
可以对函数返回值进行类型注解,如果返回值为空,那么类型为void
。原始类型
string、number(NaN,Infinity无穷大)、boolean、null、undefined(用void表示)、symbol数组类型
Array<number>、number[]
元组:[string, number] 可用于函数返回多个参数对象类型
{ [string]: string }
还可以在对象中指定任意键值对的类型,如果这个键值对可有可无那么加上?
函数类型
特殊类型
字面量类型(一般配合联合类型使用);
通过type关键字给类型使用别名或者用type单独声明一个类型;
maybe类型。Mixed & Any
mixed为强类型,any为弱类型(尽量不使用,作用是为了兼容老代码)运行环境API
TypeScript语言规范与基本应用
TypeScript是ES6 JavaScript类型化的超集,相比于JavaScript多了类型校验系统和ES6标准。
-
使用步骤:
- 安装typescript;
- 使用
tsc
(typescript compile)命令编译typescript文件,会检查代码中的类型使用异常、移除类型注解的扩展语法、自动转化ES新特性。
配置文件
使用yarn tsc --init
自动生成配置文件。ts标准库声明
标准库就是内置对象所对应的声明。
中文错误消息
使用yarn tsc --local zh-CN
以中文显示错误消息。(不推荐)-
作用域问题
- 可以使用立即执行函数,将变量放到函数作用域里;
- 使用
export
将文件作为模块使用。
ts类型
建议为每个变量添加明确的类型。
- 枚举类型
用关键字enum
声明,=
进行赋值。如果不指定值则默认从0开始累加;第一个变量如果赋值数字,后面的变量也会在此基础上开始累加。 - 任意类型
any类型是不安全的,不要轻易使用。 - 类型断言
接口
使用interface
关键词声明,约束对象的结构。
- 可选成员
?:
- 只读成员
readonly
- 动态成员
[key: string]: string