这是我参与更文挑战的第2天,活动详情查看: 更文挑战
为什么要选择第一个重学TypeScript,首先,我认为TS语法将来是一个趋势,它会变的越来越重要,第一个选择它,是想让自己养成使用TS开发习惯, 其次如果真的在项目里面使用了TS,在后期的代码维护上,会大大减少了投入成本,让自己跟上时代的步伐。
1, TS简介,优点
TypeScript是javaScript的类型的超级,它可以编译成纯JS,TypeScript可以在任何浏览器,任何计算机和任何操作系统上运行
1,JS有的基础类型,它都有,JS 没有的基础类型,它也有
TS 新增加了元组-tuple(元素类型不相同的数组)
枚举-enum(JS数据类型的补充)
Any(可为任意类型,与 Object 有一定区别)
Void(没有任何类型,通常在函数没有返回值时用)
Never(不存在的值的类型)
2,增强代码的可读性,数据交互更安全
3,增强代码的可维护性,提高生产力
4,模块管理更佳,类型检查更严格 让你的开发严谨而自由
5,TypeScript始于JavaScript,终于JavaScript。遵循JavaScript的语法和语义,所以对于我们前端从业者来说,学习前来得心应手,并没有太大的难度
6,TypeScript提供了类、模块和接口,更易于构建组件和维护。
2,安装和查看
npm install -g typescript
tsc --version
3,语法检查
在VS CODE 的File / Preference / Settings 下 搜索javascript.validate.enable和typescript.validate.enable并且取消打勾,禁用VSCODE的js和ts的语法检查
4,数据类型
Number: 数值类型
string: 字符串类型
Boolean: 布尔类型
enum: 枚举类型
any: 任意类型, 一个牛X的类型
unknown: 类型安全的any
void: 空类型,表示没有返回值
Array: 数组类型
Tuple: 元组类型
Null: 空类型
Undefined:
never: 表示永远不会返回结果
很多初学者在不确定的类型里面,都喜欢用any, 表示任意类型。
注意: 如果一个变量设置类型为:any后,相当于对该变量关闭了TS的类型检测,没有任何限制了
建议: 不建议使用any类型, 不设置任何类型的时候,JS默认为隐式的any,如果把一个any类型的变量赋值给一个有类型的变量,被赋值的变量也会变成any类型
通常我们会使用: unknown 替代any
unknown 实际上就是一个类型安全的any,
| 类型 | 描述 | 描述 |
|---|---|---|
| number | 任意数字类型 | 1,2,3 |
| string | 任意字符串类型 | 'hello' |
| boolean | 布尔值true, false | ture |
| any | 任意类型 | * |
| unknown | 类型安全的any | * |
| void | 没有值,或者undefined | undefined |
| never | 不能是任何值 | 没有值 |
| Object | 任意的JS对象 | {a: 'zlm'} |
| Array | 任意的JS数组 | [1,2,3] |
| Tuple | 元组,指定类型,指定长度的数组 | [true, 'str',123] |
| Enum | 枚举类型 | enum{a,b,c} |
| 字面量 | 变量的值就是其本身类型 | let a: 'str' | 123 |
void表示空值, never表示永远不会返回结果, 不常用,一般用于报错函数处理
// 类型断言, 可以用来告诉解析器变量实际的类型
let e: unknown;
let r: string;
e = 'hello'
r = e as string; // 断言,告诉 r, e就是字符串
r = <string> e; // 也是断言
function fn(): number | string {
return 1;
}
function fn1(): void {
return;
}
function fn2(): never {
throw new Error('报错了')
}
5, 函数
1,声明(定义)函数必须加 function 关键字;
2,函数名与变量名一样,命名规则按照标识符规则;
3,函数参数可有可无,多个参数之间用逗号隔开;
4,每个参数参数由名字与类型组成,之间用分号隔开;
5,函数的返回值可有可无,没有时,返回类型为 void,大括号中是函数体。
声明函数参数的过程中,有三种情况:
1, 可选参数:
2,默认参数
3,形参多个
function paramsDefined(name:string, age:number, sex?:boolean) :string {
return name + age + sex;
}
function paramsDefault(name:string = 'zlm', age:number = 17) :string {
return name + age;
}
function selectParams(...name:string[]):string {
let only:string = '形参:';
for(let i=0; i< name.length; i++) {
only = only +name[i]
if(i<name.length) {
only = only + ','
}
}
only = only + '等等'
return only;
}
let defined:string = paramsDefined('zzz', 22)
let dafault:string = paramsDefault()
let select:string = selectParams(...['zlm', 'Jamie', 'Jone'])
函数定义方法
1, 函数声明法
2,函数表达式法
3,箭头函数
// 函数声明法
function str(name:string, age:number): void {
console.log(name + age)
}
// 函数表达式
var add = function(num: number, str: string):any {
return num + str;
}
// 箭头函数
var sum = (n:number, m:number):number => {
return n + m;
}
问题一:
函数声明法和函数表达式法有什么区别?
6, 数组
1,数组声明的方法
字面量赋值法
let arry1: Array<number> = [1,23,4]
let arry2: number[] = [12,3,4]
let arry3: Array<boolean> = [false,true]
结构函数赋值法
let arry4: Array<number> = new Array(1,2,3,4)
let arry5: Array<boolean> = new Array(false, true, false)
元组:一个已知元素数量和类型的数组,各元素的类型不必都相同
let arry6: [string, number, boolean] = ['zlm', 10, false]
字符串的两种类型: 基本类型,引入类型
let str1:string = 'str1'
let str2:String = new String('str2')
说明:基本类型和引入类型声明的字符串没有什么不同, 基本类型的字符串可以直接使用引入类型的属性和方法
2,字符串常用的方法
let something:string = 'abcdefghijkgagagagag'
let source:string = 'gh'
// 从头部查找字符串
console.log(something.indexOf(source))
// 从字符串尾部开始查找字符串 , 如果字符串查找不到,则都返回-1
console.log(something.lastIndexOf(source))
// 从指定的位置开始截取,截取到指定的位置结束
let subStr:string = something.substring(6,8)
console.log(subStr)
// 字符串替换
let strRep:string = 'abcdeMMfghijk'
let newStr:string = 'MM'
console.log(strRep.replace(newStr, 'VV'))
3,创建日期对象Data
// 构造函数中不传递任何参数,Date()会根据当前日期和时间创建一个Date对象
var D:Date = new Date()
console.log(D)
// 如果传递一个整数,这个整数代表的距离1970-01-01 00:00:00的毫秒数
var D1:Date = new Date(200)
console.log(D1)
// 如果传递一个表示日期的字符串,就会生成对应的日期
var D2:Date = new Date('2021-05-26 12:30:00')
console.log(D2)
7,总结
TS的基础数据类型暂时回忆这么多,后面将介绍复杂数据类型