| let |
声明块级作用域变量 |
变量值需要重新赋值时 |
存在暂时性死区,不会变量提升 |
就像"临时工",在代码块内有效,可随时更换 |
let count: number = 1; count = 2; // 允许重新赋值 |
| const |
声明块级作用域常量 |
值不会改变的变量 |
必须初始化,不能只声明不赋值 |
就像"正式工合同",签了就改不了 |
const PI: number = 3.14159; // PI = 3.14; 错误! 不能重新赋值 |
| var |
声明函数级作用域变量 |
旧式变量声明,兼容性考虑 |
存在变量提升,容易出错,不建议使用 |
像"老式电话",功能旧还容易出问题 |
var oldValue = 10; // 不推荐使用 |
| number |
数值类型 |
存储整数、浮点数 |
注意浮点数精度问题 |
就是数学里的数字 |
let age: number = 25; let price: number = 99.99; |
| string |
字符串类型 |
文本数据存储 |
可用单引号、双引号、反引号 |
就是文字信息 |
let name: string = 'ArkTS'; let msg: string = "Hello ${name}"; |
| boolean |
布尔类型 |
表示真/假值 |
只有true和false两个值 |
就像"开关",只有开和关 |
let isValid: boolean = true; let isDone: boolean = false; |
| Array<T> |
数组类型 |
存储同一类型的数据集合 |
类型安全,不能混入其他类型 |
像"集装箱",装同类物品 |
let numbers: Array<number> = [1, 2, 3]; let names: string[] = ['Jack', 'Rose']; |
| type |
类型别名 |
简化复杂类型定义 |
只是别名,不创建新类型 |
给复杂类型起个"外号" |
`type Color = 'Red' |
| class |
定义类 |
创建对象模板 |
类名通常大写 |
对象的"设计图纸" |
class Person { name: string; constructor(name: string) { this.name = name; } } |
| private |
私有修饰符 |
保护内部数据不被外部访问 |
子类也无法访问 |
就像"个人日记",只有自己能看 |
class BankAccount { private balance: number; // 外部无法直接访问balance } |
| extends |
继承 |
代码复用,建立is-a关系 |
单继承,只能继承一个父类 |
就像"儿子继承父亲的特征" |
class Employee extends Person { department: string; } |
| super |
调用父类 |
子类构造函数中调用父类构造 |
必须在子类constructor中第一行调用 |
就像"先问问爸爸的意见" |
class Student extends Person { grade: number; constructor(name: string, grade: number) { super(name); this.grade = grade; } } |
| => |
箭头函数 |
简化函数写法,绑定this |
没有自己的this,arguments |
像"快递员",直接送货不绕路 |
const add = (a: number, b: number): number => a + b; const square = (x: number) => x * x; |
| async |
异步函数 |
处理耗时操作 |
总是返回Promise对象 |
告诉程序"别等我,你先忙" |
async function fetchData() { return await someAsyncCall(); } |
| await |
等待异步完成 |
在async函数内等待Promise |
只能在async函数中使用 |
像"等外卖",到了再继续吃 |
async function loadUser() { let user = await getUserData(); console.log(user); } |
| if/else |
条件判断 |
根据条件执行不同代码块 |
注意条件表达式的布尔值 |
就像"十字路口",根据路标选择方向 |
if (score >= 60) { console.log('及格'); } else { console.log('不及格'); } |
| for |
循环语句 |
重复执行固定次数的代码 |
注意循环变量的作用域 |
像"流水线",重复相同工序 |
for (let i = 0; i < 5; i++) { console.log(i); } |
| ?. |
可选链 |
安全访问可能为null的对象属性 |
遇到null/undefined立即返回undefined |
像"试探性敲门",没人应就离开 |
let userName = user?.profile?.name; // 如果user或profile为null,返回undefined |
| ?? |
空值合并 |
提供默认值 |
只对null/undefined生效 |
像"备用计划",A不行就用B |
let displayName = userName ?? '匿名用户'; // userName为null时显示'匿名用户' |
| @Entry |
应用入口 |
标记应用的根组件 |
一个应用至少有一个@Entry |
就像"公司大门",从这里进入 |
@Entry @Component struct MyApp { build() { ... } } |
| @Component |
自定义组件 |
创建可复用的UI组件 |
必须有build()方法 |
像"乐高积木",可以重复使用 |
@Component struct MyButton { build() { Button('点击我') } } |
| @State |
组件状态 |
管理组件内部数据状态 |
变化时触发UI重新渲染 |
像"组件的心情",变了就表现出来 |
@Component struct Counter { @State count: number = 0; // count变化时UI自动更新 } |
| @Prop |
单向数据流 |
父组件向子组件传递数据 |
子组件不能修改@Prop变量 |
像"传家宝",只能看不能改 |
@Component struct Child { @Prop message: string; // 从父组件接收,不能修改 } |
| @Link |
双向数据绑定 |
父子组件间双向数据同步 |
需要与父组件的@State配合使用 |
像"对讲机",两边都能说话 |
@Component struct Child { @Link value: number; // 修改value会同步到父组件 } |
| build() |
UI构建 |
描述组件UI结构 |
必须有且只能有一个根组件 |
像"建筑图纸",告诉系统怎么搭建 |
build() { Column() { Text('Hello') Button('Click') } } |
| enum |
枚举类型 |
定义一组命名常量 |
编译时确定值,运行时只读 |
像"选择题选项",固定几个选择 |
enum Direction { Up, Down, Left, Right } let move: Direction = Direction.Up; |
| interface |
接口 |
定义对象的结构契约 |
只定义结构,不包含实现 |
像"招聘要求",规定需要什么能力 |
interface User { name: string; age: number; } let user: User = {name: 'Tom', age: 20}; |
| export |
导出 |
模块中暴露变量、函数等 |
可以有多个export |
像"商店橱窗",展示可买商品 |
export const PI = 3.14; export function calculate() { ... } |
| import |
导入 |
从其他模块引入功能 |
路径需要正确 |
像"购物",从别处买来需要的东西 |
import { PI } from './math'; import ComponentA from './ComponentA'; |
| void |
无返回值 |
函数没有返回值时 |
不能赋值给其他类型 |
像"只做事不汇报" |
function logMessage(msg: string): void { console.log(msg); // 没有return语句 } |
| never |
永不返回 |
函数总是抛出异常或死循环 |
不能有任何可到达的终点 |
像"有去无回的旅程" |
function throwError(): never { throw new Error('错误'); } |