个人简介
typescript入门
内容 | 参考链接 |
---|---|
typescript(零) —— 简介、环境搭建、第一个实例 |
文章目录
认识 typescript
typescript 简介
typescript 的作用
我们都知道,javascript 是弱类型的语言,对于一些类型的限制并不是很明确。比如说我们编码一个在两个输入框中输入数字求和的加法小程序,这时候直接输入到文本框的数字会被自动转换为字符串形式,就会得到 1 + 1 = 11 的奇怪结果。那么这个时候 typescript 就可以大显身手,实现 1 + 1 = 2。
typescript 工作流
tsc (把 ts 文件转换为 js 文件)的作用相当于 babel(把高级语法和代码转换为浏览器能识别的低级语法和代码)。
编译和运行参考 typescript(零) —— 简介、环境搭建、第一个实例
上图表示:ts 文件通过 tsc 命令把 ts 文件转成了 js 文件。
typescript 的类型
相比于 javascript 的原始类型(基本数据类型)和对象类型(引用数据类型),typescript 也有自己的数据类型,内容如下:
接下来,我们对不同类型进行逐一详细的探索…
number 数字类型
对数字的定义只有一个笼统的 number 表示,既能表示 整数、也能表示 浮点数,甚至也可以表示 正负数。例如:1,3.3,-5 等等。
let num1 = 2
let num2 = 6
function add(n1: number, n2: number) {
return n1 + n2
}
console.log(add(num1, num2))
之后终端执行 tsc main.ts
和 node main.js
,可以得出结果 8
。
string 字符串类型
与 javascript 书写方式及使用方法均一致。
'前端杂货铺'
"前端杂货铺"
`前端杂货铺`
let myname: string = "前端杂货铺"
console.log('myname', myname)
之后终端执行 tsc main.ts
和 node main.js
,可以得出以下结果。
boolean 布尔类型
表示真、假,常用于处理判断逻辑。
let istrue: boolean = true
console.log('isture', istrue)
之后终端执行 tsc main.ts
和 node main.js
,可以得出以下结果。
array 数组类型
数组中可以存放任意类型的数据,js中数组的宽容度非常大,ts也继承了这一点。
以下三种写法(list1、list2、list3)表示的完全一致,鼠标移动至 list 上编译器均提示 number[]
,表示数字类型。
let list1: number[] = [1, 2, 3, 4]
let list2: array<number> = [1, 2, 3, 4]
let list3 = [1, 2, 3, 4]
下面的 list 4 为 (string | number)[],表示字符串和数字类型。
let list4 = [1, '前端杂货铺']
下面的 list 5 为 any[],表示任意类型。
let list5: any[] = [1, '前端杂货铺', true]
tuple 元组类型
固定长度,固定类型的 array,声明元组的时候一定要事先指定类型。
let person: [number, string] = [1, "前端杂货铺"]
此时,元组的长度和类型都被固定住了,当我们尝试修改元素的长度和类型都会报错。
注:元组类型有一个 bug,可以调用 push() 方法改变元组的长度。
union 联合类型
联合类型表示一个变量同时支持两个或者多个不同的类型。
let union : string | number
literal 字面量类型
可以混合使用不同的类型。
let literal : 1 | "前端杂货铺" | true | [1, 2, 3]
示例:merge 求和(分为数字和字符串两种方式)
function merge(n1: number | string, n2: number | string, resulttype: "as-number" | "as-string") {
if (resulttype === 'as-string') {
return n1.tostring() + n2.tostring()
}
if (typeof n1 === "string" || typeof n2 === "string") {
return n1.tostring() + n2.tostring()
} else {
return n1 + n2
}
}
let mergenumber1 = merge(1, 1, "as-number")
let mergenumber2 = merge(1, 1, "as-string")
let mergestring = merge("前端", "杂货铺", "as-string")
console.log(mergenumber1)
console.log(mergenumber2)
console.log(mergestring)
之后终端执行 tsc main.ts
和 node main.js
,可以得出以下结果。
enum 枚举类型
枚举允许我们定义一组命名的常量。默认情况下,我们获取到对象的某个属性打印出来的是该属性的索引,神奇的是,我们可以 给对象里面的属性赋值,这时候再获取到对象的某个属性时打印出来的就是 我们给属性赋的值 了。
enum color {
red,
yellow = '黄色',
blue = 'blue'
}
let color1 = color.red
console.log(color1)
let color2 = color.blue
console.log(color2)
let color3 = color.yellow
console.log(color3)
之后终端执行 tsc main.ts
和 node main.js
,可以得出以下结果。
any 任意类型
any 这个类型可以让我们随意定义类型,当我们“懒得”定义复杂类型结构的时候,可以合理的使用它。
let randomvalue: any = 123
randomvalue = true
randomvalue = "前端杂货铺"
randomvalue = {}
unknown 未知类型
unknown 不保证类型,但 可以保证类型安全,当我们出现错误编码时(下面的数字 123 不能调用 touppercase() 方法),使用 unknow 编译器会有报错提示。
我们可以做出以下适配,让编译器不报错。
let randomvalue: unknown = 123
randomvalue = true
randomvalue = "前端杂货铺"
randomvalue = {}
if (typeof randomvalue === 'function') {
randomvalue()
}
if (typeof randomvalue === 'string') {
randomvalue.touppercase()
}
void、undefined、never 类型
不存在时用 void,undefined 表示必须存在但可以不赋值,永远不会执行完时用 never。
此时使用了 void(默认就是 void,可加可不加),不添加返回值也一切正常。
function printresult() : void {
console.log("前端杂货铺")
}
console.log("hello", printresult())
之后终端执行 tsc main.ts
和 node main.js
,可以得出以下结果。
此时使用了 undefined,函数体里面必须有返回值,我们可以在函数体内添加 return,不然会报错。
function printresult() : undefined {
console.log("前端杂货铺")
return
}
console.log("hello", printresult())
之后终端执行 tsc main.ts
和 node main.js
,可以得出以下结果。
此时使用了 never,一般用在抛出异常或者 promise 中。
function throwerror(message: string, errorcode: number): never {
throw {
message,
errorcode
}
}
throwerror("not found", 404)
function whileloop(): never {
while(true) {
console.log("前端杂货铺")
}
}
type assertions 类型适配
第一个 endswith() 出现的地方编译器是不会自动提示补全的,因为此时的类型还是 any,而不是 string,我们可以使用 endswith() 在下面代码中第二次和第三次出现的地方的方式进行类型适配,便可以实现自动补全(在我们刚开始不明确类型,而后面明确类型后就可以使用这种类型适配的方式)
let message : any
message = "前端杂货铺"
message.endswith("铺")
(<string>message).endswith("铺")
(message as string).endswith("铺")
本章小结
存在即合理,typescript 的出现自有它的用途。typescript 作为 javascript 的超集,对 javascript 进行了一些列约束,使得弱类型的 javascript 变成强类型,这就会使得代码更清晰、可读性更高、提高了代码的可读性和可维护性,更适合开发大型应用。
结合 vue3 对 typescript 更好的包容性,使用 vue3 + ts 构建大、中、小型应用便成了一种大趋势…
发表评论