# 实现多态 API

目前 chameleon-api 提供的是主要的跨端方法,如果你 在里面没有找到需要的方法,还可以使用多态协议多态接口来进行扩展。今天我们就手把手来实现一个多态 API 接口。

# 创建一个获取一些信息的跨端接口

我们可以在项目根目录下执行 cml init component,选择 Polymorphic function,输入文件名称,例如 getSomeInfo,生成如下文件结构

├── components
│   ├── getSomeInfo
│   │   ├── getSomeInfo.interface

文件内容如下:

<script cml-type="interface">
interface GetSomeInfoInterface {
  type Info = {
    env: String,
    extra: String,
    myInput: String,
  }
  getSomeInfo(input: String): Info;
}
</script>
<script cml-type="web">
class Method implements GetSomeInfoInterface {
  getSomeInfo(input) {
    // 一些获取的操作,得到信息
    return {
      env: 'web',
      extra: '其他的信息',
      myInput: input,
    };
  }
}
export default new Method();
</script>
<script cml-type="weex">
class Method implements GetSomeInfoInterface {
  getSomeInfo(input) {
    // 一些获取的操作,得到信息
    return {
      env: 'weex',
      extra: '其他的信息',
      myInput: input,
    };
  }
}
export default new Method();
</script>
<script cml-type="wx">
class Method implements GetSomeInfoInterface {
  getSomeInfo(input) {
    // 一些获取的操作,得到信息
    return {
      env: 'wx',
      extra: '其他的信息',
      myInput: input,
    };
  }
}
export default new Method();
</script>
<script cml-type="alipay">
class Method implements GetSomeInfoInterface {
  getSomeInfo(input) {
    // 一些获取的操作,得到信息
    return {
      env: 'alipay',
      extra: '其他的信息',
      myInput: input,
    };
  }
}
export default new Method();
</script>
<script cml-type="baidu">
class Method implements GetSomeInfoInterface {
  getSomeInfo(input) {
    // 一些获取的操作,得到信息
    return {
      env: 'baidu',
      extra: '其他的信息',
      myInput: input,
    };
  }
}
export default new Method();
</script>

在 interface 文件中, 在 cml-type="interface"部分规定  入参和出参的具体类型。在 cml-type="web|weex|wx|alipay|baidu"等  各自端中实现对应方法。 即可实现一个可以跨端使用的多态接口。

# 使用多态接口

在你的项目中可以通过路径引用到该方法,进行使用。

import myApi from 'components/getSomeInfo/getSomeInfo.interface';
const someInfo = myApi.getSomeInfo();
// 对获得的信息进行使用

值得一提的是,你可以在每个端自由引入在该端所需的库(你的项目库,npm 包,jsbridge 等),尽情丰富方法的实现,如在 Web 端,当网页在客户端外的时候,你可以使用  普通方法进行实现;如果该网页也会出现在客户端内,你可以使用 jsbridge 对于方法进行  增强,获得更好的体验。