一、ArkTs 函数基础声明与参数类型标注
在 ArkTs 中,函数声明有着严谨的规范。以下是一个简单的函数示例:
function add(x: string, y: string): string {
let z: string = `${x} ${y}`;
return z;
}
这里定义了 add
函数,它接受两个 string
类型的参数 x
和 y
,并返回一个 string
类型的值。这种严格的类型标注有助于在编码阶段发现类型不匹配的错误,提高代码的稳定性和可读性。例如,当我们调用 add
函数时:
let result = add("Hello", "World");
console.log(result); // 输出 "Hello World"
二、ArkTs 函数可选参数的运用
ArkTs 提供了两种设置可选参数的方式。
// 可选参数格式 name?: Type
function hello(name?: string) {
if (name == undefined) {
console.log('hi');
} else {
console.log(`hi,${name}`);
}
}
hello
函数的 name
参数为可选参数。当我们调用该函数时:
// 不传参数调用
hello(); // 输出 "hi"
// 传入参数调用
hello("Alice"); // 输出 "hi,Alice"
另一种可选参数形式是设置默认值:
function multiply(n: number, coeff: number = 2): number {
return n * coeff;
}
对于 multiply
函数:
// 只传一个参数,使用默认的 coeff 值
console.log(multiply(3)); // 输出 6 (因为使用了默认的 coeff 值 2,计算 3 * 2)
// 传入两个参数
console.log(multiply(4, 3)); // 输出 12 (计算 4 * 3)
三、ArkTs 函数 Rest 参数的强大功能
Rest 参数允许函数接收任意数量的实参。
function sum(...numbers: number[]): number {
let res = 0;
for (let n of numbers) {
res += n;
}
return res;
}
在使用 sum
函数时:
// 不传参数调用
console.log(sum()); // 输出 0
// 传入多个参数调用
console.log(sum(1, 2, 3, 4)); // 输出 10
四、ArkTs 函数返回类型的处理
在 ArkTs 中,函数返回类型有多种处理方式。
// 显式指定返回类型
function foo(): string { return 'aaaa' };
// 推断返回类型为 string
function goo() { return 'goo' };
对于不需要返回值的函数:
// 省略返回类型标注
function hi1() { console.log('aaa') }
// 显式指定返回类型为 void
function hi2(): void { console.log('bbb') }
五、ArkTs 函数作用域与变量访问规则
ArkTs 函数遵循严格的作用域规则。
let globalVar = "I'm global";
function localVarTest() {
let localVar = "I'm local";
console.log(localVar); // 输出 "I'm local"
// 无法在函数外部访问 localVar
// console.log(globalVar); // 会报错,如果在函数内部定义了同名变量
}
localVarTest();
console.log(globalVar); // 输出 "I'm global"
函数内部定义的变量仅在函数内部可访问,若与外部同名则覆盖外部定义。
六、ArkTs 函数调用与参数传递机制
函数调用时,实参按顺序赋值给形参。
function join(x: string, y: string): string {
let z: string = `${x} ${y}`;
return z;
}
// 调用函数,传入两个 string 类型的参数
let result = join('Hello', 'World');
console.log(result); // 输出 "Hello World"
七、ArkTs 函数类型与回调函数应用
ArkTs 可以定义函数类型用于回调。
type StringFunc = (x: number) => number; // 这是一个函数类型
function do_action(f: StringFunc) {
f(5); // 调用回调函数
}
// 将 Math.sqrt 函数作为参数传入
do_action(Math.sqrt);
八、ArkTs 箭头函数的便捷性
ArkTs 支持箭头函数,具有简洁的语法。
// 箭头函数示例
let sumArrow = (x: number, y: number): number => {
return x + y;
}
// 使用箭头函数计算两数之和
console.log(sumArrow(2, 3)); // 输出 5
// 省略返回类型的箭头函数示例
let sum1 = (x: number, y: string) => { return x + y };
let sum2 = (x: number, y: string) => x + y;
// 调用 sum1 和 sum2 函数
console.log(sum1(3, " is a number")); // 输出 "3 is a number"
console.log(sum2(4, " is also a number")); // 输出 "4 is also a number"
九、ArkTs 闭包的独特魅力
闭包在 ArkTs 中有着重要的地位。
function f(): () => number {
let count = 0;
let g = (): number => { count++; return count; }
return g;
}
let z = f();
// 第一次调用 z
console.log(z()); // 返回:1
// 第二次调用 z
console.log(z()); // 返回:2
闭包由函数及其声明环境组成,能够捕获并保留局部变量,使得函数在多次调用间可以维持状态。
十、ArkTs 函数重载的实现与规则
ArkTs 支持函数重载,以满足不同的调用需求。
function foo(x: number): void; // 第一个函数定义
function foo(x: string): void; // 第二个函数定义
function foo(x: number | string): void {
if (typeof x === 'number') {
console.log(`Received a number: ${x}`);
} else if (typeof x === 'string') {
console.log(`Received a string: ${x}`);
}
};
// 调用重载的 foo 函数
foo(123); // 使用第一个函数定义,输出 "Received a number: 123"
foo("Hello, Overloading"); // 使用第二个函数定义,输出 "Received a string: Hello, Overloading"
// 不允许重载函数由相同的名字以及参数列表,否则将会编译报错
通过对 ArkTs 函数这些特性的深入理解和熟练运用,我们能够编写出更加高效、灵活且易于维护的代码,充分发挥 ArkTs 在应用开发中的优势。
请注意,以上代码示例基于 ArkTs 的相关概念和语法风格进行编写和解释,但 ArkTs 可能还有其他特定的语言细节和特性未完全涵盖在这个示例中。在实际使用 ArkTs 进行开发时,需要进一步深入学习其官方文档和相关最佳实践。