TypeScript 重学之—基础笔记

291 阅读5分钟

这是我参与更文挑战的第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, falseture
any任意类型*
unknown类型安全的any*
void没有值,或者undefinedundefined
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的基础数据类型暂时回忆这么多,后面将介绍复杂数据类型