【TypeScript】TypeScript基础
点击阅读更多查看文章内容
数据类型
- const
常量,不能改变,类型可以通过初始化的值由编译器推断,也可以自己以 变量名 : 数据类型 的方式指定
1 | const a = 'abc' |
- number
整型,浮点型,表示所有数字类型
1 | let a = 123 |
- boolean
布尔型,true/false
1 | let a : boolean = true |
- string
字符串,可以用单引号也可以用双引号
1 | let a : string = 'abc' |
- literal类型
把变量的所有可能取值都列出来
1 | let httpStatus : 200 | 404 | 500 | '200' | '404' | '500' = '200' |
- 类型的并集
使变量可以支持多种类型
1 | function f(s: 200 | 404 | 500 | '200' | '404' | '500'){ |
- any类型
相当于JavaScript,可以对变量进行任何操作,编译器都不会报错(运行可能出错)
1 | let a : any = 'abc' |
- undefined类型
定义为undefined类型,值也只能为undefined
1 | let a : undefined = undefined |
逻辑控制
if/else
等于一律使用:===
不等于一律使用:!==
undefined作为条件为false
1 | function processHttpStatus(s : 200 | 404 | 500 | '200' | '404' | '500') { |
问号表达式:typeof s === 'string' ? parseInt(s) : s
a?b|c,条件a为true返回b,否则返回c
1 | function processHttpStatus(s : 200 | 404 | 500 | '200' | '404' | '500') { |
switch
1 | function processHttpStatus(s : 200 | 404 | 500 | '200' | '404' | '500') { |
循环语句
跟C语言一样
for
1
2
3
4
5let sum = 0
for (let i = 0; i < 100; i++){
sum += i
}
console.log(sum)while
1
2
3
4
5
6
7let sum = 0
let i = 0
while (i < 100) {
sum += i
i++
}
console.log(sum)
try-catch
throw抛出错误,注意throw后面的字符串包含${}取值所以不能使用引号,要使用 `
抛出错误后程序依然会继续执行,sum输出结果为4950
1 | let sum = 0 |
若不使用try-catch,在抛出错误后程序会直接终止
1 | let sum = 0 |
枚举类型
typescript特有,JavaScript没有枚举类型
如果不对枚举类型赋值的话就从0开始递增赋值
HTTPStatus[s]可以直接打印出s,而不是其对应的枚举值
1 | enum HTTPStatus{ |
数组
定义
以下两种方法都可以,第二个是泛型类型
let a : number[] = [1,2,3]
let b : Array= [1,2,3] 1
2
3
4
5
6
7
8
9let a = [1,2,3]
let a : number[] = [1,2,3]
let a = [1,2,3,'a']
let a : (string|number)[] = [1,2,3,'a']
let b : Array<number> = [1,2,3]获取数组长度及元素,数组越界不会报错会获得undefined
Ps:空数组判断 : a.length===0,不能直接写if(a)
1 | let a : number[] = [1,2,3,4] |
增删元素
- push/pop 从数组右边增加/删除元素
- unshift/shift 从数组左边增加/删除元素
- 这里的数组可以用const定义,const表示a始终指向这个数组,数组的内容可以发生变化
1
2
3
4
5
6
7
8
9const a : number[] = []
a.push(1) // [1]
a.push(2) // [1, 2]
a.push(3) // [1, 2, 3]
a.pop() // [1, 2]
a.push(4) // [1, 2, 4]
a.shift() // [2, 4]
a.unshift(1)// [1, 2, 4]
// a = [1, 2, 3] 报错 , a为const不能指向其他数组
slice函数
a.slice(start,end):截取子数组a[start,end),前闭后开
越界不会报错,到边界就会结束
a.slice(start):从start取到数组结尾1
2
3const a = [0, 1, 2, 3, 4, 5, 6, 7]
console.log(a.slice(2, 5), a.slice(5, 10)) // [2, 3, 4], [5, 6, 7]splice函数
a.splice(start, datacount, …items):从start开始删除datacount个元素,并在start后插入items(items是可选的)
1 | const a = [0, 1, 2, 3, 4, 5, 6, 7] |
- indexOf函数
a.indexOf(searchElement, fromIndex):从下标fromIndex开始查找,返回searchElement第一次出现的位置,(fromIndex可选)
a.lastIndexOf():从后往前找
1 | const a = [0, 1, 2, 3, 4, 5, 6, 7, 11] |
- sort函数
排序,注意sort的排序是按照字典序排的,实际上对我们排序数字没有用,更多的是考虑排序一些单词,排序数字需要给sort传递一个compareFn参数。
1 | const a = [0, 1, 2, 3, 4, 5, 6, 7, 11] |
元组
没有特别的元组语法,数组就可以当元组使用1
2
3
4// 元组 tuple
const a = [1, 2, 3]
const [a1, a2, a3, a4] = a
console.log(a1, a2, a3, a4) // 1, 2, 3, undefinedsplit/join
split():使用指定的分隔符将字符串拆分为子字符串,并将它们作为数组返回。
join():将数组的所有元素添加到字符串中,以指定的分隔符字符串分隔。1
2
3// split/join
console.log('a,b,c,1,2,3'.split(',')) // ["a", "b", "c", "1", "2", "3"]
console.log([1,2,3,4].join(',')) // "1,2,3,4"forEach
遍历数组,也可以使用传统for循环遍历整个数组,推荐使用forEach1
2
3
4const a = [1,2,3,4]
a.forEach(v => {
console.log(v)
})
对象类型
不需要有类就可以直接声明
- 定义
1 | const emp1 = { |
输出结果为JSON对象 (JSON:JavaScript Object Notation)
- JSON
可以直接将输出结果赋值给新对象(字段名用不用引号效果是一样的)
这里的新对象的类型就只有从结果中读出的类型,没有emp1中额外加的类型
1 | const emp2 = { |
JSON对象转为JSON字符串JSON.stringify()
1 | const s : string = JSON.stringify(emp1) |
JSON字符串转为JSON对象JSON.parse()
,这里JSON.parse()的返回值为any类型与直接输出emp1得到的结果相同(any类型不能直接通过.获取它的内在元素)
1 | const s : string = JSON.stringify(emp1) |
对象类型不能直接比较 emp1 === emp2 返回值为false
函数
- 定义
返回值可写可不写,不写的话可以函数的返回值类型由return语句决定,没有return语句的话返回值为void1
2
3function add(a: number,b: number): number{
return a+b
} - 可选参数
?表示可选参数,如果没有输入的话,值为undefined
c||0:表示若c不为undefined的话返回值为c,否则返回值为01
2
3
4function add(a: number, b: number, c?: number): number{
return c ? a + b + c : a + b
// return a + b + (c||0)
} - 参数默认值
可选参数后的参数必须是可选参数或者带有默认值1
2
3function add(a: number, b: number, c?: number, d: number=0): number{
return a + b + (c||0) + d
} - 可变参数列表
…表示可变参数列表:可以传入任意多个参数,当做数组使用
若想将数组传入函数,可以在数组前加…,将数组展开传入函数1
2
3
4
5
6
7
8
9
10
11
12
13
14
15function add(
a: number,
b: number,
c?: number,
d: number=0,
...e: number[]): number{
let sum = a + b + (c||0) + d
for (let i = 0; i < e.length; i++){
sum += e[i]
}
return sum
}
console.log(add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
const numbers = [5, 6, 7, 8, 9, 10]
console.log(add(1, 2, 3, 4, ...numbers)) - 重载
不建议使用函数重载
函数重载通过声明函数实现
1 | function add(a: number, b: number): number |
- 对象类型参数
参数列表过多或者具有boolean类型的参数时,可以定义对象类型的参数,这样函数调用者可以清楚的理解每个参数的具体作用(如果不使用对象类型直接传入一堆参数很难理解每个参数的意义,使用对象类型在调用的时候会表明对应的参数名便于理解)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22function sendRequest(params:{
url: string,
method: 'GET'|'POST'|'PUT',
header: object,
data?: string,
requireAuth: boolean,
retry: boolean,
retryTimeout?: number,
}){}
sendRequest({
url: 'https://www.test.com',
method: 'GET',
header: {
contentType: 'application/json',
},
data: '{}',
requireAuth: false,
retry: true,
retryTimeout: 30000,
}) - 为对象定义方法
不需要加function,其他的与普通的函数定义相同
函数中的变量会从全局搜索,可以使用this引用自身的字段和方法1
2
3
4
5
6
7
8
9
10
11
12const emp1 = {
name: 'john',
salary: 8000,
bonus: undefined as number|undefined,
performance: 3.5,
updateBonus() {
if (!this.bonus) {
this.bonus = this.salary * this.performance
}
},
}
emp1.updateBonus()
【TypeScript】TypeScript基础
https://shnpd.github.io/2022/12/16/【TypeScript】TypeScript基础/