ArkTS,即Ark TypeScript,是基于TypeScript的一种编程语言,它继承了TypeScript的静态类型检查和面向对象特性,并针对特定的应用场景进行了优化。掌握ArkTS函数与类型系统对于开发者来说至关重要,因为它不仅有助于编写更安全、高效的代码,还能提升开发体验和代码的可维护性。

函数

在ArkTS中,函数是一等公民,它们可以作为参数传递给其他函数,也可以作为返回值从函数中返回。此外,ArkTS还支持匿名函数、箭头函数以及高阶函数等高级特性。

声明函数

定义一个简单的函数,使用`function`关键字:

```typescript

function add(a: number, b: number): number {

return a + b;

}

console.log(add(1, 2)); // 输出: 3

```

箭头函数

箭头函数提供了更加简洁的语法,同时它也绑定了词法作用域的`this`:

```typescript

const subtract = (a: number, b: number): number => a - b;

console.log(subtract(5, 2)); // 输出: 3

```

高阶函数

高阶函数是指将函数作为参数或者返回值的函数。以下是一个接受函数作为参数的例子:

```typescript

function operateOnNumbers(a: number, b: number, operation: (x: number, y: number) => number): number {

return operation(a, b);

}

const multiply = (x: number, y: number): number => x * y;

console.log(operateOnNumbers(4, 2, multiply)); // 输出: 8

```

类型系统

ArkTS的类型系统是静态的,这意味着所有的类型检查都在编译时完成。这为开发者提供了更好的错误预防机制,并且IDE工具能够提供更智能的代码补全和重构建议。

基本类型

ArkTS支持多种基本数据类型,包括但不限于:

- `boolean`

- `number`

- `string`

- `array`

- `tuple`

- `enum`

- `any`

- `void`

- `null`

- `undefined`

- `never`

使用示例

```typescript

let isDone: boolean = false;

let age: number = 26;

let name: string = "Alice";

let list: number[] = [1, 2, 3];

let tuple: [string, number] = ["hello", 10];

enum Color {Red, Green, Blue};

let c: Color = Color.Green;

let notSure: any = 4;

notSure = "maybe a string instead";

notSure = false; // okay, definitely a boolean

function warnUser(): void {

console.log("This is my warning message");

}

let u: undefined = undefined;

let n: null = null;

// never类型的变量只能赋值为throw表达式或不能达到的return语句

function error(message: string): never {

throw new Error(message);

}

```

接口(Interfaces)

接口用于定义对象的结构,包括属性和方法。通过接口,我们可以确保对象遵循一定的契约。

```typescript

interface LabelledValue {

label: string;

}

function printLabel(labelledObj: LabelledValue) {

console.log(labelledObj.label);

}

let myObj = { size: 10, label: "Size 10 Object" };

printLabel(myObj); // 正确,尽管myObj有额外的属性

```

泛型(Generics)

泛型允许我们创建灵活的、可复用的组件。它可以应用于函数、类和接口。

```typescript

function identity(arg: T): T {

return arg;

}

let output = identity("myString"); // 指定T为string

```

联合类型(Union Types)

联合类型表示一个值可以是几种类型之一。当一个值为联合类型时,任何操作都必须考虑到所有可能的类型。

```typescript

function padLeft(value: string, padding: string | number) {

if (typeof padding === "number") {

return Array(padding + 1).join(" ") + value;

}

return padding + value;

}

console.log(padLeft("Hello world", 4)); // 输出: " Hello world"

```

交叉类型(Intersection Types)

交叉类型组合多个类型成一个新的类型,这个新类型会拥有这些类型的所有成员。

```typescript

interface Errorable {

error?: string;

}

interface HasSuccessFlag {

success: boolean;

}

type SuccessOrFailure = Errorable & HasSuccessFlag;

const s: SuccessOrFailure = { success: true };

```

类型别名(Type Aliases)

类型别名用来给一个类型起个新名字。它们和接口类似,但有一些不同之处,比如可以用于原始类型、联合类型和交叉类型。

```typescript

type Name = string;

type NameOrNumber = Name | number;

type Message = { text: string };

function greet(name: Name): string {

return "Hello, " + name;

}

greet("Alice"); // 正确

```

类型断言(Type Assertions)

有时候你比编译器更了解某个值的实际类型,这时你可以使用类型断言来告诉编译器该值的类型。

```typescript

let someValue: any = "this is a string";

let strLength: number = (someValue as string).length;

```

类型推论(Type Inference)

大多数情况下,ArkTS可以自动推导出类型,因此不需要显式地指定类型。

```typescript

let inferredString = "Hello"; // 类型被推断为string

```

函数重载(Function Overloads)

函数重载允许为同一个函数提供多个调用签名。实际的实现部分仍然只有一个,但是可以通过不同的参数列表来调用。

```typescript

function makeDate(timestamp: number): Date;

function makeDate(m: number, d: number, y: number): Date;

function makeDate(mOrTimestamp: number, d?: number, y?: number): Date {

if (d !== undefined && y !== undefined) {

return new Date(y, mOrTimestamp, d);

} else {

return new Date(mOrTimestamp);

}

}

const d1 = makeDate(12345678);

const d2 = makeDate(5, 5, 5);

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐