HarmonyOS鸿蒙Next ArkTS中如何使用方法重载?

HarmonyOS鸿蒙Next ArkTS中如何使用方法重载? 比如,通过id和名字寻找时,返回唯一的用户;条件搜索时,返回用户列表。

3 回复

效果图:

cke_5862.png

核心代码:

// 重载签名
function findUser(id: number): User | undefined;
function findUser(name: string): User | undefined;
function findUser(callback: (user: User) => boolean): User[];

// 实现
function findUser(
  param: number | string | ((user: User) => boolean)
): User | undefined | User[] {
  if (typeof param === 'number') {
    return users.find(user => user.id === param);
  } else if (typeof param === 'string') {
    return users.find(user => user.name === param);
  } else {
    return users.filter(param);
  }
}

完整代码:

interface User {
  id: number;
  name: string;
  age: number;
  gender: string;
}

const users: User[] = [
  { id: 1, name: "张三", age: 25, gender: "男" },
  { id: 2, name: "李四", age: 30, gender: "男" },
  { id: 3, name: "王五", age: 28, gender: "男" },
  { id: 4, name: "赵六", age: 22, gender: "女" },
  { id: 5, name: "孙七", age: 35, gender: "女" }
];


// 重载签名
function findUser(id: number): User | undefined;
function findUser(name: string): User | undefined;
function findUser(callback: (user: User) => boolean): User[];

// 实现
function findUser(
  param: number | string | ((user: User) => boolean)
): User | undefined | User[] {
  if (typeof param === 'number') {
    return users.find(user => user.id === param);
  } else if (typeof param === 'string') {
    return users.find(user => user.name === param);
  } else {
    return users.filter(param);
  }
}

@Entry
@ComponentV2
struct FindUserPage {
  @Local result: string = '';

  build() {
    Column({ space: 20 }) {
      Button('通过ID(3)查找用户')
        .width('90%')
        .onClick(() => {
          const user = findUser(3);
          this.result =
            user ? `通过ID查找: ID: ${user.id}, 姓名: ${user.name}, 性别: ${user.gender}` : '未找到该ID的用户';
        })

      Button('通过姓名查找"李四"')
        .width('90%')
        .onClick(() => {
          const user = findUser("李四");
          this.result =
            user ? `通过姓名查找: ID: ${user.id}, 年龄: ${user.age}, 性别: ${user.gender}` : '未找到该姓名的用户';
        })

      Button('查找所有女性用户')
        .width('90%')
        .onClick(() => {
          const femaleUsers = findUser(
            (user: User) => user.gender === '女'
          );
          this.result =
            `通过回调函数查找: 找到${femaleUsers.length}个女性用户\n${femaleUsers.map(u => `${u.name}(${u.gender}, ${u.age}岁)`)
              .join('、')}`;
        })

      Button('查找所有男性用户')
        .width('90%')
        .onClick(() => {
          const maleUsers = findUser(
            (user: User) => user.gender === '男'
          );
          this.result =
            `通过回调函数查找: 找到${maleUsers.length}个男性用户\n${maleUsers.map(u => `${u.name}(${u.gender}, ${u.age}岁)`)
              .join('、')}`;
        })

      Button('查找年龄大于28岁的用户')
        .width('90%')
        .onClick(() => {
          const olderUsers = findUser(
            (user: User) => user.age > 28
          );
          this.result =
            `通过回调函数查找: 找到${olderUsers.length}个年龄大于28岁的用户\n${olderUsers.map(u => `${u.name}(${u.age}岁, ${u.gender})`)
              .join('、')}`;
        })

      Button('查找30岁以下的女性用户')
        .width('90%')
        .onClick(() => {
          const filteredUsers = findUser(
            (user: User) => user.gender === '女' && user.age < 30
          );
          this.result =
            `通过回调函数查找: 找到${filteredUsers.length}个30岁以下的女性用户\n${filteredUsers.map(u => `${u.name}(${u.age}岁)`)
              .join('、')}`;
        })

      Text(this.result)
        .fontSize(20)
        .width('100%')
        .textAlign(TextAlign.Start)
        .padding(10)
        .border({ width: 1, color: Color.Grey })
        .borderRadius(8)
    }
    .width('100%')
    .height('100%')
    .padding(20)
  }
}

更多关于HarmonyOS鸿蒙Next ArkTS中如何使用方法重载?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在ArkTS中,方法重载通过定义多个同名方法实现,这些方法需具有不同的参数列表(参数类型、数量或顺序不同)。编译器会根据调用时传入的实际参数类型和数量来匹配并执行对应的方法。

在HarmonyOS Next的ArkTS中,可以通过为同一个函数名定义多个具有不同参数列表(参数类型、数量或顺序不同)的函数签名来实现方法重载。编译器会根据调用时传入的实际参数类型和数量来匹配并执行对应的函数实现。

针对你“通过id或名字查找返回单个用户,条件搜索返回列表”的具体场景,一个典型的ArkTS实现示例如下:

class User {
  id: number = 0;
  name: string = '';
  age: number = 0;
  // ... 其他属性
}

class UserService {
  private users: User[] = []; // 假设已有用户数据

  // 重载签名1:通过id查找
  findUser(id: number): User | undefined;
  
  // 重载签名2:通过name查找
  findUser(name: string): User | undefined;
  
  // 重载签名3:通过条件对象查找
  findUser(condition: { minAge?: number; maxAge?: number }): User[];
  
  // 函数实现(需要处理所有重载情况)
  findUser(param: number | string | { minAge?: number; maxAge?: number }): User | User[] | undefined {
    if (typeof param === 'number') {
      // 按id查找逻辑
      return this.users.find(user => user.id === param);
    } else if (typeof param === 'string') {
      // 按name查找逻辑
      return this.users.find(user => user.name === param);
    } else {
      // 条件搜索逻辑
      let result = this.users;
      if (param.minAge !== undefined) {
        result = result.filter(user => user.age >= param.minAge!);
      }
      if (param.maxAge !== undefined) {
        result = result.filter(user => user.age <= param.maxAge!);
      }
      return result;
    }
  }
}

// 使用示例
const service = new UserService();

// 调用重载1:通过id查找(返回User | undefined)
const userById = service.findUser(1);

// 调用重载2:通过name查找(返回User | undefined)
const userByName = service.findUser("张三");

// 调用重载3:条件搜索(返回User[])
const userList = service.findUser({ minAge: 18, maxAge: 30 });

关键点说明:

  1. 重载签名:在函数实现之前,先声明函数的不同调用方式(参数和返回类型)。这提供了清晰的类型提示。
  2. 实现函数:需要一个通用的实现来处理所有重载签名中定义的参数类型组合。通常使用类型守卫(如typeofinstanceof)或属性检查来区分不同的参数类型,并执行对应的逻辑。
  3. 返回类型:实现函数的返回类型必须是所有重载签名返回类型的联合类型(本例中为 User | User[] | undefined)。

这种方式能提供良好的类型安全性和代码提示,调用时编译器能根据传入的参数类型推断出正确的返回类型。

回到顶部