在 ArkTS(HarmonyOS Ability Runtime TypeScript)中,interface(接口)是一种强大的类型工具,它主要用于定义对象的结构,为对象的属性和方法提供类型约束,帮助开发者编写更加规范、可维护和可扩展的代码。以下是关于 ArkTS 中 interface 的详细介绍:

一 基本定义与语法

在 ArkTS 里,使用 interface 关键字来定义接口,其基本语法如下:

interface 接口名称 {
    属性名: 属性类型;
    方法名(参数列表): 返回值类型;
}

下面是一个简单的示例,定义了一个表示人的接口:

interface Person {
    name: string;
    age: number;
    sayHello(): void;
}

在上述代码中,Person 接口定义了一个对象应该具有 name(字符串类型)、age(数字类型)属性,以及一个无返回值的 sayHello 方法。

二 接口的使用

当定义好接口后,就可以用它来约束对象的类型。示例如下:

interface Person {
    name: string;
    age: number;
    sayHello(): void;
}

let person: Person = {
    name: 'Alice',
    age: 25,
    sayHello: function() {
        console.log(`Hello, my name is ${this.name}.`);
    }
};

person.sayHello();

在这个例子中,person 对象遵循了 Person 接口的定义,所以它包含 name、age 属性和 sayHello 方法。

2.1 接口属性

可选属性
在接口中,可以使用 ? 来标记可选属性,这意味着对象可以有该属性,也可以没有。示例如下:

interface Book {
    title: string;
    author?: string;
    year: number;
}

let book1: Book = {
    title: 'The Great Gatsby',
    year: 1925
};

let book2: Book = {
    title: 'To Kill a Mockingbird',
    author: 'Harper Lee',
    year: 1960
};

在 Book 接口中,author 是可选属性,book1 对象没有 author 属性,而 book2 对象有。

只读属性
使用 readonly 关键字可以将接口的属性设置为只读,一旦对象被初始化,该属性的值就不能再被修改。示例如下:

interface Point {
    readonly x: number;
    readonly y: number;
}

let point: Point = { x: 10, y: 20 };
// 下面这行代码会报错,因为 x 是只读属性
// point.x = 30; 

接口属性可以是字段、getter、setter或getter和setter组合的形式。
属性字段只是getter/setter对的便捷写法。以下表达方式是等价的:

interface Style {
  color: string;
}
interface Style {
  get color(): string;
  set color(x: string);
}

实现接口的类也可以使用以下两种方式:

interface Style {
  color: string;
}

class StyledRectangle implements Style {
  color: string = '';
}
interface Style {
  color: string;
}

class StyledRectangle implements Style {
  color: string = '';
}

2.2 接口继承

接口可以继承其他接口,如下面的示例所示:

interface Style {
  color: string;
}

interface ExtendedStyle extends Style {
  width: number;
}

继承接口包含被继承接口的所有属性和方法,还可以添加自己的属性和方法。

三 抽象类和接口

抽象类与接口都无法实例化。抽象类是类的抽象,抽象类用来捕捉子类的通用特性,接口是行为的抽象。在ArkTS中抽象类与接口的区别如下:

  • 一个类只能继承一个抽象类,而一个类可以实现一个或多个接口;
  • 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
  • 抽象类里面可以有方法的实现,但是接口完全都是抽象的,不存在方法的实现;
  • 抽象类可以有构造函数,而接口不能有构造函数。
Logo

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

更多推荐