4 第2章:基础语法
4.1 🎯 学习目标
- 掌握变量与常量的声明方式
- 理解ArkTS的数据类型系统
- 熟练使用各类运算符
- 理解类型推断与类型注解
4.2 2.1 变量与常量
4.2.1 📦 变量声明
ArkTS中有两种声明变量的方式:
| 关键字 | 说明 | 是否允许重新赋值 |
|---|---|---|
let |
声明变量 | ✅ 允许 |
const |
声明常量 | ❌ 不允许 |
// 使用 let 声明变量
let userName: string = '张三'
userName = '李四' // ✅ 允许修改
// 使用 const 声明常量
const PI: number = 3.14159
// PI = 3.14 // ❌ 编译错误:不能修改常量注意:
ArkTS要求所有变量和常量在声明时必须初始化,或者在构造函数中初始化!
// ❌ 错误:未初始化
let age: number
age = 20 // 这样分开写是不允许的
// ✅ 正确:声明时初始化
let age: number = 20
// ✅ 正确:在类中可以在构造函数中初始化
class Person {
name: string
constructor(name: string) {
this.name = name // 在构造函数中初始化
}
}4.2.2 🔍 类型推断
ArkTS支持类型推断,如果你在声明时直接赋值,编译器可以自动推断出变量类型:
// 显式类型注解
let score: number = 95
// 类型推断:编译器自动推断 message 为 string 类型
let message = 'Hello ArkTS'
// 类型推断:编译器自动推断 flag 为 boolean 类型
let flag = true🧪 互动练习:类型推断测试
下面的变量声明中,编译器会推断出什么类型?
let a = 100 // 推断类型:?let b = 'hello' // 推断类型:?let c = [1, 2, 3] // 推断类型:?let d = { x: 1, y: 2 } // 推断类型:?4.3 2.2 数据类型
ArkTS的数据类型分为基本数据类型和引用数据类型。
4.3.1 🔢 基本数据类型
| 类型 | 说明 | 示例 |
|---|---|---|
number |
数值(整数和浮点数) | let a: number = 42 |
string |
字符串 | let s: string = 'Hello' |
boolean |
布尔值 | let b: boolean = true |
void |
空值(函数无返回值) | function f(): void {} |
never |
永远不会出现的值 | 抛出异常的函数 |
null |
空值 | let n: null = null |
undefined |
未定义 | let u: undefined = undefined |
4.3.2 📚 引用数据类型
// 数组 - 两种方式
let arr1: number[] = [1, 2, 3]
let arr2: Array<string> = ['a', 'b', 'c']
// 元组 - 固定长度和类型的数组
let tuple: [string, number] = ['年龄', 25]
// 枚举
enum Color { Red, Green, Blue }
let c: Color = Color.Red // 值为 0
// 对象
let person: { name: string, age: number } = {
name: '张三',
age: 25
}
// Any类型(不推荐,慎用)
let anything: any = 'hello'
anything = 42 // ✅ 允许,但失去了类型保护4.3.3 🔄 类型转换
// 字符串转数字
let str: string = '123'
let num: number = parseInt(str) // 123
let num2: number = Number(str) // 123
let num3: number = +str // 123(简洁写法)
// 数字转字符串
let n: number = 456
let s1: string = n.toString() // '456'
let s2: string = String(n) // '456'
let s3: string = n + '' // '456'(简洁写法)
// 布尔转换
let b1: boolean = Boolean(1) // true
let b2: boolean = !!'hello' // true(常用技巧)🧮 互动演示:类型转换计算器
结果:-
结果:-
4.4 2.3 运算符
4.4.1 ➕ 算术运算符
let a: number = 10
let b: number = 3
a + b // 13(加法)
a - b // 7(减法)
a * b // 30(乘法)
a / b // 3.3333...(除法)
a % b // 1(求余)
a ** b // 1000(幂运算)
++a // 11(自增)
--a // 10(自减)4.4.2 🔍 比较运算符
let x: number = 5
let y: number = '5'
x == y // true(值相等,会进行类型转换)
x === y // false(严格相等,类型和值都相等)
x != y // false
x !== y // true
x > 3 // true
x <= 5 // true最佳实践:
始终使用 === 和 !== 进行比较,避免使用 == 和 !=,因为后者会进行隐式类型转换,可能导致意外结果。
4.4.3 🔗 逻辑运算符
let a: boolean = true
let b: boolean = false
a && b // false(与:都为真才为真)
a || b // true(或:有一个为真就为真)
!a // false(非:取反)4.4.4 📝 赋值运算符
let x: number = 10
x = 20 // 简单赋值
x += 5 // x = x + 5,结果:25
x -= 3 // x = x - 3,结果:22
x *= 2 // x = x * 2,结果:44
x /= 4 // x = x / 4,结果:11
x %= 3 // x = x % 3,结果:24.4.5 🧩 三元运算符
let age: number = 20
let status: string = age >= 18 ? '成年' : '未成年'
// status 的值为 '成年'🎮 互动练习:运算符计算器
4.5 2.4 类型注解与类型断言
4.5.1 📋 类型注解
类型注解用于明确指定变量的类型:
// 基本类型注解
let name: string = '张三'
let age: number = 25
let isStudent: boolean = false
// 数组类型注解
let scores: number[] = [90, 85, 92]
let names: Array<string> = ['张三', '李四']
// 对象类型注解
let person: { name: string, age: number } = {
name: '张三',
age: 25
}
// 函数类型注解
function add(x: number, y: number): number {
return x + y
}4.5.2 🔄 类型断言
当你比编译器更清楚某个值的类型时,可以使用类型断言:
// 方式一:as 语法(推荐)
let someValue: any = '这是一段字符串'
let strLength: number = (someValue as string).length
// 方式二:尖括号语法(不推荐,在.tsx文件中不可用)
let strLength2: number = (<string>someValue).length
// 实用场景:DOM操作
let inputElement = document.getElementById('myInput') as HTMLInputElement
inputElement.value = 'Hello'类型断言 vs 类型转换
类型断言不改变值的实际类型,只是告诉编译器”相信我,我知道它的类型”。 它类似于其他语言中的”类型转换”,但在运行时没有任何效果。
4.6 2.5 联合类型与字面量类型
4.6.1 🔀 联合类型
联合类型表示一个值可以是多种类型之一:
// 联合类型:可以是 number 或 string
let id: number | string
id = 12345 // ✅ 允许
id = 'ABC999' // ✅ 允许
// id = true // ❌ 错误:boolean不在联合类型中
// 联合类型在函数参数中
function printId(id: number | string): void {
console.log('ID: ' + id)
}
// 类型缩小(Type Narrowing)
function process(input: number | string): void {
if (typeof input === 'number') {
// 在这个分支中,input被缩小为 number 类型
console.log(input.toFixed(2))
} else {
// 在这个分支中,input被缩小为 string 类型
console.log(input.toUpperCase())
}
}4.6.2 📌 字面量类型
字面量类型指定一个值只能是某几个特定的值:
// 字符串字面量类型
let direction: 'up' | 'down' | 'left' | 'right'
direction = 'up' // ✅ 允许
// direction = 'north' // ❌ 错误
// 数字字面量类型
let diceRoll: 1 | 2 | 3 | 4 | 5 | 6
diceRoll = 3 // ✅ 允许
// 结合枚举使用
enum Status {
Pending = 'pending',
Approved = 'approved',
Rejected = 'rejected'
}
let currentStatus: Status = Status.Pending🎯 互动练习:联合类型理解
下面的函数参数使用了联合类型,请看代码并回答:可以传入哪些类型的值?
function formatValue(val: number | string | boolean): string {
return String(val);
}
return String(val);
}
4.7 📝 本章小结
本章我们学习了ArkTS的基础语法:
- 变量与常量:
let声明变量,const声明常量 - 数据类型:基本类型(number、string、boolean等)和引用类型(数组、对象、枚举等)
- 运算符:算术、比较、逻辑、赋值、三元运算符
- 类型注解:显式指定变量类型
- 类型断言:告诉编译器变量的实际类型
- 联合类型与字面量类型:更灵活的类型定义方式
4.8 ✏️ 练习
- 声明一个常量
PI,值为 3.14159,并计算半径为 5 的圆的面积 - 编写一个函数,接受
number | string类型的参数,返回它的字符串表示 - 使用枚举定义一个星期几的类型,并声明一个变量使用它
- 实践类型断言:获取一个DOM元素并设置它的
value属性