HarmonyOS 鸿蒙Next中什么语法可以判断泛型R属于这个接口,定义了泛型类里有参数是泛型要如何初始化

HarmonyOS 鸿蒙Next中什么语法可以判断泛型R属于这个接口,定义了泛型类里有参数是泛型要如何初始化

什么语法可以判断泛型R属于这个接口?我定义了一个request<R, D>函数,我在调用的地方传进来的响应参数R属于ResponseJson,但是希望在request函数里判断如果传进来是ResponseJson这个接口,做一些处理。

已知instanceof方法只能用在class类上,源码如下:

interface ResponseJson<R> {
  success: boolean
  errorCode: string
  message?: string
  data: R
}

export function request<R, D>(opts: RequestOpt<D>): Promise<R> {
  return new Promise((resolve: Function, reject: Function) => {
    const success = (res: AxiosResponse) => {
      if (res.data instanceof ResponseJson) { // FIXME: error

      }

      Logger.info(JSON.stringify(res.data))
      resolve(res.data)
    }

    const fail = (err: AxiosError) => {
      Logger.error(`
        ==== request error ====
        message: ${err.message}
        code: ${err.code}
      `)
      reject(err)
    }

    const complete = () => {}

    Logger.info(JSON.stringify(opts))
    axios.request({
      url: opts.url,
      method: opts.method, // `method` 是创建请求时使用的方法 支持post/get/put/delete方法,不区分大小写,默认为get方法
      baseURL: config.devStatus === 'release' ? config.api : config.devApi, // `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
      params: opts.params, // 与请求一起发送的 URL 参数,必须是纯对象或 URLSearchParams 对象
      data: opts.data, // 作为请求主体发送的数据,仅适用于请求方法 PUT、POST 和 PATCH
      responseType: opts.responseType || 'object',
      headers: opts.headers || { 'Content-Type': 'text/plain' },
      timeout: opts.timeout || 10000, // 指定请求超时之前的毫秒数
    }).then(success).catch(fail).finally(complete)
  })
}

如果将ResponseJson修改为class,定义了泛型R,泛型无法初始化,要如何解决?

```typescript
export class ResponseJson<R> {
  success: boolean = false
  errorCode: string = ''
  message?: string
  data: R = {} // FIXME: error
}

不可以使用data?: R,因为data参数必定存在


更多关于HarmonyOS 鸿蒙Next中什么语法可以判断泛型R属于这个接口,定义了泛型类里有参数是泛型要如何初始化的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

可以使用instanceof进行类型判断,但instanceof只能用在class类上,需要根据以下参考进行修改:

export interface ResponseJson<R> {
  success: boolean
  errorCode: string
  message?: string
  data: R | null
}

export class ResponseJsonClass<R> implements ResponseJson<R> {
  success: boolean = false
  errorCode: string = ''
  message?: string
  data: R | null = null
  constructor(success: boolean, errorCode: string, message: string, data: R | null) {
    this.success = success;
    this.errorCode = errorCode;
    this.message = message;
    this.data = data;
  }
}
// 其中泛型R可以转换成其他的类,比如以下类
export class TestMap {
  message: string;
  constructor(msg: string) {
    this.message = msg;
  }
}
//具体转换如下,可进行参考:
// let testMap:TestMap = new TestMap('diis');
// let reClass1:ResponseJson<TestMap> = new ResponseJsonClass(true,'dsa','dgger',testMap);

let reClass:ResponseJson<TestMap> = new ResponseJsonClass(true,'dsa','dgger',null);

更多关于HarmonyOS 鸿蒙Next中什么语法可以判断泛型R属于这个接口,定义了泛型类里有参数是泛型要如何初始化的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,可以使用is关键字来判断泛型R是否属于某个接口。例如:

if (R is SomeInterface) {
    // R 属于 SomeInterface
}

对于定义了泛型类且参数是泛型的情况,可以通过构造函数或工厂方法进行初始化。例如:

class GenericClass<T> {
    private value: T;

    constructor(value: T) {
        this.value = value;
    }
}

// 使用构造函数初始化
let instance = new GenericClass<string>("Hello");

或者使用工厂方法:

function createGenericInstance<T>(value: T): GenericClass<T> {
    return new GenericClass(value);
}

// 使用工厂方法初始化
let instance = createGenericInstance<number>(42);

以上代码展示了如何在鸿蒙Next中判断泛型是否属于某个接口,以及如何初始化泛型类中的泛型参数。

在HarmonyOS鸿蒙Next中,可以使用R extends InterfaceName语法判断泛型R是否属于某个接口。例如:class MyClass<R extends MyInterface>。泛型类中的泛型参数可以通过构造函数或方法进行初始化。例如:

class MyClass<R extends MyInterface> {
    private R instance;
    public MyClass(R instance) {
        this.instance = instance;
    }
}

这样,R必须实现MyInterface,并通过构造函数传入具体实例。

回到顶部