在HarmonyOS的ArkTS中,泛型类和泛型接口是实现代码复用和类型安全的重要机制,它们允许组件在定义时不指定具体类型,而是在使用时动态指定。你提供的代码很好地展示了它们的基本用法,下面我来详细解释:
泛型接口(Generic Interface)
// 定义泛型接口,T是类型变量
interface IPerson<T> {
a: T; // 属性a的类型为T
b: T[]; // 属性b是T类型的数组
c: (aa: T) => T; // 方法c接收T类型参数并返回T类型
}
// 使用时指定具体类型为string
const obj: IPerson<string> = {
a: "xxx",
b: ["xx", "xx"],
c(aa: string) {
return aa;
}
};
泛型接口的优势是可以为同一接口结构支持多种数据类型,而无需重复定义多个接口。例如,你可以同样创建IPerson<number>
类型的对象。
泛型类(Generic Class)
// 定义泛型类,T和K是类型变量
class Person<T, K> {
name: T; // 名称属性类型为T
age: K; // 年龄属性类型为K
constructor(name: T, age: K) {
this.name = name;
this.age = age;
}
}
// 使用时指定具体类型:T为string,K为number
const p1 = new Person<string, number>("小明", 100);
泛型类支持多个类型变量,使类的属性和方法可以灵活适配不同数据类型。例如,你也可以创建Person<number, string>
类型的实例,表示用数字作为名称,用字符串表示年龄。
泛型的主要作用
- 代码复用:一套逻辑支持多种数据类型,减少重复代码
- 类型安全:编译期进行类型检查,避免运行时类型错误
- 灵活性:提高代码的通用性和扩展性
实际应用示例
在HarmonyOS开发中,泛型常用于集合类、网络请求封装、状态管理等场景:
// 泛型工具类示例
class DataStore<T> {
private data: T[] = [];
addItem(item: T): void {
this.data.push(item);
}
getItem(index: number): T {
return this.data[index];
}
}
// 使用时指定类型
const userStore = new DataStore<User>();
const postStore = new DataStore<Post>();
通过泛型,你可以构建更加灵活、通用且类型安全的HarmonyOS应用代码。
// 泛型接口
interface IPerson<T> {
a: T
b: T[]
c: (aa: T) => T
}
const obj: IPerson<string> = {
a: "xxx",
b: ["xx", "xx"],
c(aa: string) {
return aa
}
}
class Person<T, K> {
name: T
age: K
constructor(name: T, age: K) {
this.name = name
this.age = age
}
}
const p1 = new Person<string,number>("小明",100)
@Entry
@Component
struct Index {
@State message: string = 'Hello World';
build() {
RelativeContainer() {
Text(this.message)
.id('HelloWorld')
.fontSize($r('app.float.page_text_font_size'))
.fontWeight(FontWeight.Bold)
.alignRules({
center: { anchor: '__container__', align: VerticalAlign.Center },
middle: { anchor: '__container__', align: HorizontalAlign.Center }
})
.onClick(() => {
this.message = 'Welcome';
})
}
.height('100%')
.width('100%')
}
}