typescript解决了JavaScript类型系统的问题,提供代码的可靠程度;
一 分类
1 强类型和弱类型(类型安全的角度)
强类型语言层面限制了函数的实参类型必须和形参类型一致;
弱类型就不会限制实参的类型,运行可能有问题,但是语法不会报错;
强类型有更强的类型约束;
弱类型中几乎没有类型约束;
强类型中不允许任何的隐式类型转换;
弱类型中允许任意的隐式类型转换
2 静态类型和动态类型(类型检查的角度)
静态类型语言,一个变量声明时,它的类型就是确定的;声明过后,它的类型就不允许修改;
动态类型语言,运行阶段才能明确变量类型,而且变量的类型可以随时发生变化;动态类型语言中,变量是没有类型的,变量的值才有类型
3 弱类型语言的问题
// 弱类型语言的问题// 1const foo = {};// 耗时操作后使用foo的不存在的方法setTimeout(() => {foo.add('1');}, 1000);// 等运行完了才会报错,影响效率// 2const sum = function (a, b) {return a + b;};console.log(sum(1,2))console.log(sum(1,'2'))// 不同类型执行的结果超乎预期,导致函数功能可能发生变化// 3const obj = {true: 111}console.log(obj['true'])// 不同类型的key在同名情况下会重复
4 强类型的优势
- 错误更早暴露
- 代码更智能,编码更准确
- 重构更牢靠
- 减少不必要的类型判断
二 flow
1 flow 起步
安装 yarn add flow-bin
初始化flow yarn flow init
检查 yarn flow
代码添加@flow标记
添加参数类型
2 flow 编译移除注解
1>用flow-remove-types工具
添加移除模块 yarn add flow-remove-types
执行命令移除src下的文件注解到dist目录 yarn flow-remove-types src -d dist
2>用babel 配合flow工具
添加模块 yarn add @babel/core @babel/cli @babel/preset-flow
添加babel配置 .babelrc
执行命令 yarn babel src -d dist{"presets": ["@babel/preset-flow"]}
3 开发工具下的flow插件
vscode下安装flow-langular-support插件
就会在标注后自动错误提示
4 flow 类型推断

5 类型注解 ```javascript /**- 类型注解
- @flow
- @param {} n / function square(n: number) { return n * n; } let num: number = 100;
num = ‘1111’; // 标识错误
function foo(): number { return ‘1111’; // 标识错误 }
function foo(): number { // number下回标识错误
}
function foo(): void { // 无返回值用void类型
}
6 flow数据类型```javascript/**** @flow**/// 原始类型-----------------const a: string = 'jason';const b: number = Infinity; // NaN // 100const c: boolean = true; // falseconst d: null = null;const e: void = undefined;const f: Symbol = Symbol();// 数组类型-----------------const arr1: Array<number> = [1, 23, 3];const arr2: number[] = [1, 2, 3];// 元组const arr3: [string, number] = ['22', 3];// 对象类型-----------------const obj1: { foo: string, bar: number } = { foo: '111', bar: 11 };const obj2: { foo?: string, bar: number } = { bar: 11 };const obj3: { [string]: string } = {};obj3.key1 = '111';// obj3.key2 = 20 // 标识出错误// 函数类型-----------------function foo(callback: (string, number) => void) {callback('string', 100)}foo(function(str, n){})// 特殊类型-----------------// 字面量类型const aa: 'foo' = 'foo';// 联合类型const type: 'success' | 'waring' | 'danger' = 'success';const bb: string | number = 'sss' // 200// type关键词type StringOrNumber = string | number;const cc: StringOrNumber = 200;// maybe类型const gender: ?number = undefined;// 等价于const gender1: number|null|void = undefined;// mixed类型-----------------// string | number | boolean | ...function passMixed (value: mixed) {// 语法报错// value.substr(1);// value* valueif(typeof value === 'string') {value.substr(1);}}passMixed(100)passMixed('100')// any类型-----------------// 弱类型function passAny(value: any) {// 语法不报错value.substr(1);value* value}passAny(100)passAny('100')
7 flow对运行环境的API的传参也会校验如document.getElementById()
