3  第2章:基础语法

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,结果:2

4.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);
}

4.7 📝 本章小结

本章我们学习了ArkTS的基础语法:

  1. 变量与常量let 声明变量,const 声明常量
  2. 数据类型:基本类型(number、string、boolean等)和引用类型(数组、对象、枚举等)
  3. 运算符:算术、比较、逻辑、赋值、三元运算符
  4. 类型注解:显式指定变量类型
  5. 类型断言:告诉编译器变量的实际类型
  6. 联合类型与字面量类型:更灵活的类型定义方式

4.8 ✏️ 练习

  1. 声明一个常量 PI,值为 3.14159,并计算半径为 5 的圆的面积
  2. 编写一个函数,接受 number | string 类型的参数,返回它的字符串表示
  3. 使用枚举定义一个星期几的类型,并声明一个变量使用它
  4. 实践类型断言:获取一个DOM元素并设置它的 value 属性

4.9 📚 参考资料