HarmonyOS鸿蒙Next ArkTS中如何定义参数类型,能够校验方法参数必须被@Builder装饰

HarmonyOS鸿蒙Next ArkTS中如何定义参数类型,能够校验方法参数必须被@Builder装饰

class Utils {
  uiContext: UIContext;
  createComponentContent(component: ESObject, params: object): ComponentContent<object>{
    return new ComponentContent(
      this.uiContext,
      wrapBuilder(component),
      params
    )
  }
}

更多关于HarmonyOS鸿蒙Next ArkTS中如何定义参数类型,能够校验方法参数必须被@Builder装饰的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

目前不支持通过参数类型定义校验出参数是被@Builder装饰的function,而不是任意function

更多关于HarmonyOS鸿蒙Next ArkTS中如何定义参数类型,能够校验方法参数必须被@Builder装饰的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,ArkTS可以通过类型注解和条件类型来定义参数类型。要校验方法参数必须被@Builder装饰,可以使用条件类型结合extends关键字。例如:

type BuilderDecorated<T> = T extends { [@Builder](/user/Builder): any } ? T : never;

function validateBuilderParam<T>(param: BuilderDecorated<T>) {
    // 此处处理参数
}

这样,validateBuilderParam方法将只接受被@Builder装饰的参数。

在HarmonyOS Next的ArkTS中,要确保方法参数必须被@Builder装饰,可以通过自定义类型来实现。以下是解决方案:

// 定义一个类型来标识被[@Builder](/user/Builder)装饰的函数
type BuilderFunction = () => void;

class Utils {
  uiContext: UIContext;
  
  createComponentContent(component: BuilderFunction, params: object): ComponentContent<object> {
    return new ComponentContent(
      this.uiContext,
      wrapBuilder(component),
      params
    )
  }
}

这样定义后,当传入的函数没有被@Builder装饰时,编译器会报类型不匹配的错误。需要注意的是,这只是一个类型层面的约束,运行时仍需要确保传入的函数确实被@Builder装饰过。

如果需要更严格的检查,可以考虑在运行时添加验证逻辑:

function isBuilderFunction(fn: any): boolean {
  // 这里添加具体的验证逻辑
  return true; // 示例代码
}

class Utils {
  uiContext: UIContext;
  
  createComponentContent(component: BuilderFunction, params: object): ComponentContent<object> {
    if (!isBuilderFunction(component)) {
      throw new Error("参数必须是被[@Builder](/user/Builder)装饰的函数");
    }
    return new ComponentContent(
      this.uiContext,
      wrapBuilder(component),
      params
    )
  }
}
回到顶部