Browse Source

初始化

gemercheung 2 năm trước cách đây
commit
f4259e82f9
38 tập tin đã thay đổi với 33806 bổ sung0 xóa
  1. 31 0
      .eslintrc.js
  2. 2 0
      .gitignore
  3. 35 0
      miniprogram/app.json
  4. 10 0
      miniprogram/app.scss
  5. 18 0
      miniprogram/app.ts
  6. 7 0
      miniprogram/custom-tab-bar/index.json
  7. 6 0
      miniprogram/custom-tab-bar/index.scss
  8. 29 0
      miniprogram/custom-tab-bar/index.ts
  9. 5 0
      miniprogram/custom-tab-bar/index.wxml
  10. 3 0
      miniprogram/pages/index/index.json
  11. 19 0
      miniprogram/pages/index/index.scss
  12. 50 0
      miniprogram/pages/index/index.ts
  13. 4 0
      miniprogram/pages/index/index.wxml
  14. 8 0
      miniprogram/pages/my/my.json
  15. 29 0
      miniprogram/pages/my/my.scss
  16. 72 0
      miniprogram/pages/my/my.ts
  17. 23 0
      miniprogram/pages/my/my.wxml
  18. 8 0
      miniprogram/pages/personal/personal.json
  19. 1 0
      miniprogram/pages/personal/personal.scss
  20. 66 0
      miniprogram/pages/personal/personal.ts
  21. 10 0
      miniprogram/pages/personal/personal.wxml
  22. 7 0
      miniprogram/sitemap.json
  23. 19 0
      miniprogram/utils/util.ts
  24. 58 0
      package-lock.json
  25. 16 0
      package.json
  26. 40 0
      project.config.json
  27. 7 0
      project.private.config.json
  28. 33 0
      tsconfig.json
  29. 8 0
      typings/index.d.ts
  30. 1 0
      typings/types/index.d.ts
  31. 162 0
      typings/types/wx/index.d.ts
  32. 29181 0
      typings/types/wx/lib.wx.api.d.ts
  33. 416 0
      typings/types/wx/lib.wx.app.d.ts
  34. 68 0
      typings/types/wx/lib.wx.behavior.d.ts
  35. 979 0
      typings/types/wx/lib.wx.cloud.d.ts
  36. 676 0
      typings/types/wx/lib.wx.component.d.ts
  37. 1436 0
      typings/types/wx/lib.wx.event.d.ts
  38. 263 0
      typings/types/wx/lib.wx.page.d.ts

+ 31 - 0
.eslintrc.js

@@ -0,0 +1,31 @@
+/*
+ * Eslint config file
+ * Documentation: https://eslint.org/docs/user-guide/configuring/
+ * Install the Eslint extension before using this feature.
+ */
+module.exports = {
+  env: {
+    es6: true,
+    browser: true,
+    node: true,
+  },
+  ecmaFeatures: {
+    modules: true,
+  },
+  parserOptions: {
+    ecmaVersion: 2018,
+    sourceType: 'module',
+  },
+  globals: {
+    wx: true,
+    App: true,
+    Page: true,
+    getCurrentPages: true,
+    getApp: true,
+    Component: true,
+    requirePlugin: true,
+    requireMiniProgram: true,
+  },
+  // extends: 'eslint:recommended',
+  rules: {},
+}

+ 2 - 0
.gitignore

@@ -0,0 +1,2 @@
+node_modules
+miniprogram/miniprogram_npm

+ 35 - 0
miniprogram/app.json

@@ -0,0 +1,35 @@
+{
+  "pages": [
+    "pages/index/index",
+    "pages/my/my",
+    "pages/personal/personal"
+  ],
+  "window": {
+    "backgroundTextStyle": "light",
+    "navigationBarBackgroundColor": "#fff",
+    "navigationBarTitleText": "首页",
+    "navigationBarTextStyle": "black"
+  },
+  "sitemapLocation": "sitemap.json",
+  "usingComponents": {
+    "t-tab-bar": "tdesign-miniprogram/tab-bar/tab-bar",
+    "t-tab-bar-item": "tdesign-miniprogram/tab-bar/tab-bar-item",
+    "t-icon": "tdesign-miniprogram/icon/icon"
+  },
+  "tabBar": {
+    "custom": true,
+    "color": "#000000",
+    "selectedColor": "#000000",
+    "backgroundColor": "#000000",
+    "list": [
+      {
+        "pagePath": "pages/index/index",
+        "text": "首页"
+      },
+      {
+        "pagePath": "pages/my/my",
+        "text": "我的"
+      }
+    ]
+  }
+}

+ 10 - 0
miniprogram/app.scss

@@ -0,0 +1,10 @@
+/**app.wxss**/
+.container {
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: space-between;
+  padding: 200rpx 0;
+  box-sizing: border-box;
+} 

+ 18 - 0
miniprogram/app.ts

@@ -0,0 +1,18 @@
+// app.ts
+App<IAppOption>({
+  globalData: {},
+  onLaunch() {
+    // 展示本地存储能力
+    const logs = wx.getStorageSync('logs') || []
+    logs.unshift(Date.now())
+    wx.setStorageSync('logs', logs)
+
+    // 登录
+    wx.login({
+      success: res => {
+        console.log(res.code)
+        // 发送 res.code 到后台换取 openId, sessionKey, unionId
+      },
+    })
+  },
+})

+ 7 - 0
miniprogram/custom-tab-bar/index.json

@@ -0,0 +1,7 @@
+{
+  "component": true,
+  "usingComponents": {
+    "t-tab-bar": "tdesign-miniprogram/tab-bar/tab-bar",
+    "t-tab-bar-item": "tdesign-miniprogram/tab-bar/tab-bar-item"
+}
+}

+ 6 - 0
miniprogram/custom-tab-bar/index.scss

@@ -0,0 +1,6 @@
+/* custom-tab-bar/index.wxss */
+.custom-tab-bar {
+  --td-tab-bar-item-color: black;
+  --td-tab-bar-item-active-color: #e78747;
+  --td-tab-bar-active-bg: rgb(218, 152, 108, 0.1);
+}

+ 29 - 0
miniprogram/custom-tab-bar/index.ts

@@ -0,0 +1,29 @@
+Component({
+  data: {
+    value: 0,
+    tabBar: [{
+      url: '/pages/index/index',
+      icon: 'home',
+      label: '首页',
+    }, {
+      url: '/pages/my/my',
+      icon: 'user',
+      label: '我的'
+    }]
+  },
+
+  methods: {
+    onChange(e: WechatMiniprogram.TouchEvent) {
+      this.setData({ value: e.detail.value });
+      wx.switchTab({
+        url: this.data.tabBar[e.detail.value].url
+      });
+    },
+    init() {
+      const page = getCurrentPages().pop();
+      this.setData({
+        value: this.data.tabBar.findIndex(item => item.url === `/${page?.route}`)
+      });
+    }
+  },
+})

+ 5 - 0
miniprogram/custom-tab-bar/index.wxml

@@ -0,0 +1,5 @@
+<t-tab-bar class="custom-tab-bar" split="{{false}}" value="{{value}}" bindchange="onChange" theme="tag" color="{{['#0EBD8D', 'rgba(0, 0, 0, .9)']}}">
+  <t-tab-bar-item wx:for="{{tabBar}}" wx:for-item="item" wx:for-index="index" wx:key="index" icon="{{item.icon}}" value="{{item.value}}">
+    {{item.label}}
+  </t-tab-bar-item>
+</t-tab-bar>

+ 3 - 0
miniprogram/pages/index/index.json

@@ -0,0 +1,3 @@
+{
+  "usingComponents": {}
+}

+ 19 - 0
miniprogram/pages/index/index.scss

@@ -0,0 +1,19 @@
+/**index.wxss**/
+.userinfo {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  color: #aaa;
+}
+
+.userinfo-avatar {
+  overflow: hidden;
+  width: 128rpx;
+  height: 128rpx;
+  margin: 20rpx;
+  border-radius: 50%;
+}
+
+.usermotto {
+  margin-top: 200px;
+}

+ 50 - 0
miniprogram/pages/index/index.ts

@@ -0,0 +1,50 @@
+// index.ts
+// 获取应用实例
+const app = getApp<IAppOption>()
+
+Page({
+  data: {
+    motto: 'Hello World',
+    userInfo: {},
+    hasUserInfo: false,
+    canIUse: wx.canIUse('button.open-type.getUserInfo'),
+    canIUseGetUserProfile: false,
+    canIUseOpenData: wx.canIUse('open-data.type.userAvatarUrl') && wx.canIUse('open-data.type.userNickName') // 如需尝试获取用户信息可改为false
+  },
+  // 事件处理函数
+  bindViewTap() {
+
+  },
+  onLoad() {
+    // @ts-ignore
+    if (wx.getUserProfile) {
+      this.setData({
+        canIUseGetUserProfile: true
+      })
+    }
+  },
+  onShow() {
+    this.getTabBar().init();
+  },
+  getUserProfile() {
+    // 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认,开发者妥善保管用户快速填写的头像昵称,避免重复弹窗
+    wx.getUserProfile({
+      desc: '展示用户信息', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
+      success: (res) => {
+        console.log(res)
+        this.setData({
+          userInfo: res.userInfo,
+          hasUserInfo: true
+        })
+      }
+    })
+  },
+  getUserInfo(e: any) {
+    // 不推荐使用getUserInfo获取用户信息,预计自2021年4月13日起,getUserInfo将不再弹出弹窗,并直接返回匿名的用户个人信息
+    console.log(e)
+    this.setData({
+      userInfo: e.detail.userInfo,
+      hasUserInfo: true
+    })
+  }
+})

+ 4 - 0
miniprogram/pages/index/index.wxml

@@ -0,0 +1,4 @@
+<!--index.wxml-->
+<view class="container">
+
+</view>

+ 8 - 0
miniprogram/pages/my/my.json

@@ -0,0 +1,8 @@
+{
+  "navigationBarTitleText": "个人中心",
+  "navigationBarTextStyle": "black",
+  "usingComponents": {
+    "t-cell": "tdesign-miniprogram/cell/cell",
+    "t-avatar": "tdesign-miniprogram/avatar/avatar"
+  }
+}

+ 29 - 0
miniprogram/pages/my/my.scss

@@ -0,0 +1,29 @@
+/* pages/my/my.wxss */
+.personal-center {
+  background-color: #eeeeee;
+}
+
+.personal-panel {
+  width: 100%;
+  min-height: 200rpx;
+  display: flex;
+  align-items: center;
+  padding:  0 50rpx;
+
+  .avatar {
+    margin-right: 30rpx;
+  }
+
+  .personal-info {
+    display: flex;
+    flex-direction: column;
+
+    .title {
+      font-size: 36rpx;
+      line-height: 64rpx;
+    }
+    .desc {
+      font-size: 24rpx;
+    }
+  }
+}

+ 72 - 0
miniprogram/pages/my/my.ts

@@ -0,0 +1,72 @@
+// pages/my/my.ts
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+    avatar: 'https://cdn-we-retail.ym.tencent.com/retail-ui/components-exp/avatar/avatar-v2/1.png',
+    nickname: '发哥',
+  },
+
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow() {
+    this.getTabBar().init();
+  },
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload() {
+
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh() {
+
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom() {
+
+  },
+
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage() {
+
+  },
+
+  handleToPersonalEdit() {
+    wx.navigateTo({
+      url: "/pages/personal/personal"
+    })
+  }
+})

+ 23 - 0
miniprogram/pages/my/my.wxml

@@ -0,0 +1,23 @@
+<!--pages/my/my.wxml-->
+<view class="personal-center" bindtap="handleToPersonalEdit">
+  <view class="personal-panel">
+    <t-avatar image="{{avatar}}" class="avatar"  size="large"/>
+    <view class="personal-info">
+      <text class="title">{{nickname}}</text>
+      <text class="desc">点击查看个人信息</text>
+    </view>
+  </view>
+  <t-cell title="我的带看" arrow>
+    <t-icon name="root-list" color="#ed7b2f" slot="left-icon" />
+  </t-cell>
+  <t-cell title="关注公众号" note="获取最新资讯,咨询" arrow>
+    <t-icon name="chart-bubble" color="#ed7b2f" slot="left-icon" />
+  </t-cell>
+  <t-cell title="客服电话" note="400-669-8025" arrow>
+    <t-icon name="call" color="#ed7b2f" slot="left-icon" />
+  </t-cell>
+  <t-cell title="关于我们" arrow>
+    <t-icon name="precise-monitor" color="#ed7b2f" slot="left-icon" />
+  </t-cell>
+
+</view>

+ 8 - 0
miniprogram/pages/personal/personal.json

@@ -0,0 +1,8 @@
+{
+  "navigationBarTitleText": "个人信息",
+  "navigationBarTextStyle": "black",
+  "usingComponents": {
+    "t-cell": "tdesign-miniprogram/cell/cell",
+    "t-avatar": "tdesign-miniprogram/avatar/avatar"
+  }
+}

+ 1 - 0
miniprogram/pages/personal/personal.scss

@@ -0,0 +1 @@
+/* pages/personal/personal.wxss */

+ 66 - 0
miniprogram/pages/personal/personal.ts

@@ -0,0 +1,66 @@
+// pages/personal/personal.ts
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide() {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload() {
+
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh() {
+
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom() {
+
+  },
+
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage() {
+
+  }
+})

+ 10 - 0
miniprogram/pages/personal/personal.wxml

@@ -0,0 +1,10 @@
+<!--pages/personal/personal.wxml-->
+<view>
+
+  <t-cell title="头像" arrow>
+    <view class="avatar" slot="left-icon">
+      <open-data type="userAvatarUrl" />
+    </view>
+  </t-cell>
+
+</view>

+ 7 - 0
miniprogram/sitemap.json

@@ -0,0 +1,7 @@
+{
+  "desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html",
+  "rules": [{
+  "action": "allow",
+  "page": "*"
+  }]
+}

+ 19 - 0
miniprogram/utils/util.ts

@@ -0,0 +1,19 @@
+export const formatTime = (date: Date) => {
+  const year = date.getFullYear()
+  const month = date.getMonth() + 1
+  const day = date.getDate()
+  const hour = date.getHours()
+  const minute = date.getMinutes()
+  const second = date.getSeconds()
+
+  return (
+    [year, month, day].map(formatNumber).join('/') +
+    ' ' +
+    [hour, minute, second].map(formatNumber).join(':')
+  )
+}
+
+const formatNumber = (n: number) => {
+  const s = n.toString()
+  return s[1] ? s : '0' + s
+}

+ 58 - 0
package-lock.json

@@ -0,0 +1,58 @@
+{
+  "name": "livestream-miniapp",
+  "version": "1.0.0",
+  "lockfileVersion": 2,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "livestream-miniapp",
+      "version": "1.0.0",
+      "dependencies": {
+        "tdesign-miniprogram": "^0.30.0"
+      },
+      "devDependencies": {
+        "miniprogram-api-typings": "^2.8.3-1"
+      }
+    },
+    "node_modules/dayjs": {
+      "version": "1.11.7",
+      "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.7.tgz",
+      "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ=="
+    },
+    "node_modules/miniprogram-api-typings": {
+      "version": "2.12.0",
+      "resolved": "https://registry.npmmirror.com/miniprogram-api-typings/-/miniprogram-api-typings-2.12.0.tgz",
+      "integrity": "sha512-ibvbqeslVFur0IAvTxLMvsbtvVcMo6gwvOnj0YZHV7aeDLu091VQRrETT2QuiG9P6aZWRcxeNGJChRKVPCp9VQ==",
+      "dev": true
+    },
+    "node_modules/tdesign-miniprogram": {
+      "version": "0.30.0",
+      "resolved": "https://registry.npmmirror.com/tdesign-miniprogram/-/tdesign-miniprogram-0.30.0.tgz",
+      "integrity": "sha512-ayR74I76niTNtwiLHzYU2+2mVIB94+9nbPiOw/CSoiVm4PafxOyZMvP4AJC4UXPS+UWTRIo2ANC6oK9xTDLIIw==",
+      "dependencies": {
+        "dayjs": "^1.10.7"
+      }
+    }
+  },
+  "dependencies": {
+    "dayjs": {
+      "version": "1.11.7",
+      "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.7.tgz",
+      "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ=="
+    },
+    "miniprogram-api-typings": {
+      "version": "2.12.0",
+      "resolved": "https://registry.npmmirror.com/miniprogram-api-typings/-/miniprogram-api-typings-2.12.0.tgz",
+      "integrity": "sha512-ibvbqeslVFur0IAvTxLMvsbtvVcMo6gwvOnj0YZHV7aeDLu091VQRrETT2QuiG9P6aZWRcxeNGJChRKVPCp9VQ==",
+      "dev": true
+    },
+    "tdesign-miniprogram": {
+      "version": "0.30.0",
+      "resolved": "https://registry.npmmirror.com/tdesign-miniprogram/-/tdesign-miniprogram-0.30.0.tgz",
+      "integrity": "sha512-ayR74I76niTNtwiLHzYU2+2mVIB94+9nbPiOw/CSoiVm4PafxOyZMvP4AJC4UXPS+UWTRIo2ANC6oK9xTDLIIw==",
+      "requires": {
+        "dayjs": "^1.10.7"
+      }
+    }
+  }
+}

+ 16 - 0
package.json

@@ -0,0 +1,16 @@
+{
+  "name": "livestream-miniapp",
+  "version": "1.0.0",
+  "scripts": {},
+  "keywords": [],
+  "author": "",
+  "license": "ISC",
+  "dependencies": {
+    "tdesign-miniprogram": "^0.30.0"
+  },
+  "devDependencies": {
+    "miniprogram-api-typings": "^2.8.3-1"
+  },
+  "main": ".eslintrc.js",
+  "description": ""
+}

+ 40 - 0
project.config.json

@@ -0,0 +1,40 @@
+{
+  "description": "项目配置文件",
+  "packOptions": {
+    "ignore": [],
+    "include": []
+  },
+  "miniprogramRoot": "miniprogram/",
+  "compileType": "miniprogram",
+  "projectname": "ts-sass-demo",
+  "setting": {
+    "packNpmManually": true,
+    "packNpmRelationList": [
+      {
+        "packageJsonPath": "./package.json",
+        "miniprogramNpmDistDir": "miniprogram/"
+      }
+    ],
+    "useCompilerPlugins": [
+      "typescript",
+      "sass"
+    ],
+    "babelSetting": {
+      "ignore": [],
+      "disablePlugins": [],
+      "outputPath": ""
+    },
+    "es6": true,
+    "enhance": true
+  },
+  "simulatorType": "wechat",
+  "simulatorPluginLibVersion": {},
+  "condition": {},
+  "srcMiniprogramRoot": "miniprogram/",
+  "appid": "wxccde54bffe44af9d",
+  "libVersion": "2.28.1",
+  "editorSetting": {
+    "tabIndent": "insertSpaces",
+    "tabSize": 2
+  }
+}

+ 7 - 0
project.private.config.json

@@ -0,0 +1,7 @@
+{
+  "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html",
+  "projectname": "livestream-miniapp",
+  "setting": {
+    "compileHotReLoad": true
+  }
+}

+ 33 - 0
tsconfig.json

@@ -0,0 +1,33 @@
+{
+  "compilerOptions": {
+    "strictNullChecks": true,
+    "noImplicitAny": true,
+    "module": "CommonJS",
+    "target": "ES2020",
+    "allowJs": true,
+    "allowSyntheticDefaultImports": true,
+    "esModuleInterop": true,
+    "experimentalDecorators": true,
+    "noImplicitThis": true,
+    "noImplicitReturns": true,
+    "alwaysStrict": true,
+    "noFallthroughCasesInSwitch": true,
+    "noUnusedLocals": true,
+    "noUnusedParameters": true,
+    "strict": true,
+    "strictPropertyInitialization": true,
+    "lib": ["ES2020"],
+    "typeRoots": [
+      "./typings"
+    ]
+  },
+  "include": [
+    "./**/*.ts"
+  ],
+  "exclude": [
+    "node_modules"
+  ],
+  "paths": {
+    "tdesign-miniprogram/*": ["./miniprogram/miniprogram_npm/tdesign-miniprogram/*"]
+  }
+}

+ 8 - 0
typings/index.d.ts

@@ -0,0 +1,8 @@
+/// <reference path="./types/index.d.ts" />
+
+interface IAppOption {
+  globalData: {
+    userInfo?: WechatMiniprogram.UserInfo,
+  }
+  userInfoReadyCallback?: WechatMiniprogram.GetUserInfoSuccessCallback,
+}

+ 1 - 0
typings/types/index.d.ts

@@ -0,0 +1 @@
+/// <reference path="./wx/index.d.ts" />

+ 162 - 0
typings/types/wx/index.d.ts

@@ -0,0 +1,162 @@
+/*! *****************************************************************************
+Copyright (c) 2022 Tencent, Inc. All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+***************************************************************************** */
+
+/// <reference path="./lib.wx.app.d.ts" />
+/// <reference path="./lib.wx.page.d.ts" />
+/// <reference path="./lib.wx.api.d.ts" />
+/// <reference path="./lib.wx.cloud.d.ts" />
+/// <reference path="./lib.wx.component.d.ts" />
+/// <reference path="./lib.wx.behavior.d.ts" />
+/// <reference path="./lib.wx.event.d.ts" />
+
+declare namespace WechatMiniprogram {
+    type IAnyObject = Record<string, any>
+    type Optional<F> = F extends (arg: infer P) => infer R ? (arg?: P) => R : F
+    type OptionalInterface<T> = { [K in keyof T]: Optional<T[K]> }
+    interface AsyncMethodOptionLike {
+        success?: (...args: any[]) => void
+    }
+    type PromisifySuccessResult<
+        P,
+        T extends AsyncMethodOptionLike
+    > = P extends {
+        success: any
+    }
+        ? void
+        : P extends { fail: any }
+        ? void
+        : P extends { complete: any }
+        ? void
+        : Promise<Parameters<Exclude<T['success'], undefined>>[0]>
+
+    //  TODO: Extract real definition from `lib.dom.d.ts` to replace this
+    type IIRFilterNode = any
+    type WaveShaperNode = any
+    type ConstantSourceNode = any
+    type OscillatorNode = any
+    type GainNode = any
+    type BiquadFilterNode = any
+    type PeriodicWaveNode = any
+    type BufferSourceNode = any
+    type ChannelSplitterNode = any
+    type ChannelMergerNode = any
+    type DelayNode = any
+    type DynamicsCompressorNode = any
+    type ScriptProcessorNode = any
+    type PannerNode = any
+    type AnalyserNode = any
+    type AudioListener = any
+    type WebGLTexture = any
+    type WebGLRenderingContext = any
+
+    // TODO: fill worklet type
+    type WorkletFunction = (...args: any) => any
+    type AnimationObject = any
+    type SharedValue = any
+    type DerivedValue = any
+}
+
+declare let console: WechatMiniprogram.Console
+
+declare let wx: WechatMiniprogram.Wx
+/** 引入模块。返回模块通过 `module.exports` 或 `exports` 暴露的接口。 */
+interface Require {
+    (
+        /** 需要引入模块文件相对于当前文件的相对路径,或 npm 模块名,或 npm 模块路径。不支持绝对路径 */
+        module: string,
+        /** 用于异步获取其他分包中的模块的引用结果,详见 [分包异步化]((subpackages/async)) */
+        callback?: (moduleExport: any) => void,
+        /** 异步获取分包失败时的回调,详见 [分包异步化]((subpackages/async)) */
+        errorCallback?: (err: any) => void
+    ): any
+    /** 以 Promise 形式异步引入模块。返回模块通过 `module.exports` 或 `exports` 暴露的接口。 */
+    async(
+        /** 需要引入模块文件相对于当前文件的相对路径,或 npm 模块名,或 npm 模块路径。不支持绝对路径 */
+        module: string
+    ): Promise<any>
+}
+declare const require: Require
+/** 引入插件。返回插件通过 `main` 暴露的接口。 */
+interface RequirePlugin {
+    (
+        /** 需要引入的插件的 alias */
+        module: string,
+        /** 用于异步获取其他分包中的插件的引用结果,详见 [分包异步化]((subpackages/async)) */
+        callback?: (pluginExport: any) => void
+    ): any
+    /** 以 Promise 形式异步引入插件。返回插件通过 `main` 暴露的接口。 */
+    async(
+        /** 需要引入的插件的 alias */
+        module: string
+    ): Promise<any>
+}
+declare const requirePlugin: RequirePlugin
+/** 插件引入当前使用者小程序。返回使用者小程序通过 [插件配置中 `export` 暴露的接口](https://developers.weixin.qq.com/miniprogram/dev/framework/plugin/using.html#%E5%AF%BC%E5%87%BA%E5%88%B0%E6%8F%92%E4%BB%B6)。
+ *
+ * 该接口只在插件中存在
+ *
+ * 最低基础库: `2.11.1` */
+declare function requireMiniProgram(): any
+/** 当前模块对象 */
+declare let module: {
+    /** 模块向外暴露的对象,使用 `require` 引用该模块时可以获取 */
+    exports: any
+}
+/** `module.exports` 的引用 */
+declare let exports: any
+
+/** [clearInterval(number intervalID)](https://developers.weixin.qq.com/miniprogram/dev/api/base/timer/clearInterval.html)
+ *
+ * 取消由 setInterval 设置的定时器。 */
+declare function clearInterval(
+    /** 要取消的定时器的 ID */
+    intervalID: number
+): void
+/** [clearTimeout(number timeoutID)](https://developers.weixin.qq.com/miniprogram/dev/api/base/timer/clearTimeout.html)
+ *
+ * 取消由 setTimeout 设置的定时器。 */
+declare function clearTimeout(
+    /** 要取消的定时器的 ID */
+    timeoutID: number
+): void
+/** [number setInterval(function callback, number delay, any rest)](https://developers.weixin.qq.com/miniprogram/dev/api/base/timer/setInterval.html)
+ *
+ * 设定一个定时器。按照指定的周期(以毫秒计)来执行注册的回调函数 */
+declare function setInterval(
+    /** 回调函数 */
+    callback: (...args: any[]) => any,
+    /** 执行回调函数之间的时间间隔,单位 ms。 */
+    delay?: number,
+    /** param1, param2, ..., paramN 等附加参数,它们会作为参数传递给回调函数。 */
+    rest?: any
+): number
+/** [number setTimeout(function callback, number delay, any rest)](https://developers.weixin.qq.com/miniprogram/dev/api/base/timer/setTimeout.html)
+ *
+ * 设定一个定时器。在定时到期以后执行注册的回调函数 */
+declare function setTimeout(
+    /** 回调函数 */
+    callback: (...args: any[]) => any,
+    /** 延迟的时间,函数的调用会在该延迟之后发生,单位 ms。 */
+    delay?: number,
+    /** param1, param2, ..., paramN 等附加参数,它们会作为参数传递给回调函数。 */
+    rest?: any
+): number

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 29181 - 0
typings/types/wx/lib.wx.api.d.ts


+ 416 - 0
typings/types/wx/lib.wx.app.d.ts

@@ -0,0 +1,416 @@
+/*! *****************************************************************************
+Copyright (c) 2022 Tencent, Inc. All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+***************************************************************************** */
+
+declare namespace WechatMiniprogram.App {
+    interface ReferrerInfo {
+        /** 来源小程序或公众号或App的 appId
+         *
+         * 以下场景支持返回 referrerInfo.appId:
+         * - 1020(公众号 profile 页相关小程序列表): appId
+         * - 1035(公众号自定义菜单):来源公众号 appId
+         * - 1036(App 分享消息卡片):来源应用 appId
+         * - 1037(小程序打开小程序):来源小程序 appId
+         * - 1038(从另一个小程序返回):来源小程序 appId
+         * - 1043(公众号模板消息):来源公众号 appId
+         */
+        appId: string
+        /** 来源小程序传过来的数据,scene=1037或1038时支持 */
+        extraData?: any
+    }
+
+    type SceneValues =
+        | 1000
+        | 1001
+        | 1005
+        | 1006
+        | 1007
+        | 1008
+        | 1010
+        | 1011
+        | 1012
+        | 1013
+        | 1014
+        | 1017
+        | 1019
+        | 1020
+        | 1022
+        | 1023
+        | 1024
+        | 1025
+        | 1026
+        | 1027
+        | 1028
+        | 1029
+        | 1030
+        | 1031
+        | 1032
+        | 1034
+        | 1035
+        | 1036
+        | 1037
+        | 1038
+        | 1039
+        | 1042
+        | 1043
+        | 1044
+        | 1045
+        | 1046
+        | 1047
+        | 1048
+        | 1049
+        | 1052
+        | 1053
+        | 1054
+        | 1056
+        | 1057
+        | 1058
+        | 1059
+        | 1060
+        | 1064
+        | 1065
+        | 1067
+        | 1068
+        | 1069
+        | 1071
+        | 1072
+        | 1073
+        | 1074
+        | 1077
+        | 1078
+        | 1079
+        | 1081
+        | 1082
+        | 1084
+        | 1088
+        | 1089
+        | 1090
+        | 1091
+        | 1092
+        | 1095
+        | 1096
+        | 1097
+        | 1099
+        | 1100
+        | 1101
+        | 1102
+        | 1103
+        | 1104
+        | 1106
+        | 1107
+        | 1113
+        | 1114
+        | 1119
+        | 1120
+        | 1121
+        | 1124
+        | 1125
+        | 1126
+        | 1129
+        | 1131
+        | 1133
+        | 1135
+        | 1144
+        | 1145
+        | 1146
+        | 1148
+        | 1150
+        | 1151
+        | 1152
+        | 1153
+        | 1154
+        | 1155
+        | 1157
+        | 1158
+        | 1160
+        | 1167
+        | 1168
+        | 1169
+        | 1171
+        | 1173
+        | 1175
+        | 1176
+        | 1177
+        | 1178
+        | 1179
+        | 1181
+        | 1183
+        | 1184
+        | 1185
+        | 1186
+        | 1187
+        | 1189
+        | 1191
+        | 1192
+        | 1193
+        | 1194
+        | 1195
+        | 1196
+        | 1197
+        | 1198
+        | 1200
+        | 1201
+        | 1202
+        | 1203
+        | 1206
+        | 1207
+        | 1208
+        | 1212
+        | 1215
+        | 1216
+        | 1223
+        | 1228
+        | 1231
+
+    interface LaunchShowOption {
+        /** 打开小程序的路径 */
+        path: string
+        /** 打开小程序的query */
+        query: IAnyObject
+        /** 打开小程序的场景值
+         * - 1000:其他
+         * - 1001:发现栏小程序主入口,「最近使用」列表(基础库 2.2.4 版本起包含「我的小程序」列表)
+         * - 1005:微信首页顶部搜索框的搜索结果页
+         * - 1006:发现栏小程序主入口搜索框的搜索结果页
+         * - 1007:单人聊天会话中的小程序消息卡片
+         * - 1008:群聊会话中的小程序消息卡片
+         * - 1010:收藏夹
+         * - 1011:扫描二维码
+         * - 1012:长按图片识别二维码
+         * - 1013:扫描手机相册中选取的二维码
+         * - 1014:小程序订阅消息(与 1107 相同)
+         * - 1017:前往小程序体验版的入口页
+         * - 1019:微信钱包(微信客户端 7.0.0 版本改为支付入口)
+         * - 1020:公众号 profile 页相关小程序列表(已废弃)
+         * - 1022:聊天顶部置顶小程序入口(微信客户端 6.6.1 版本起废弃)
+         * - 1023:安卓系统桌面图标
+         * - 1024:小程序 profile 页
+         * - 1025:扫描一维码
+         * - 1026:发现栏小程序主入口,「附近的小程序」列表
+         * - 1027:微信首页顶部搜索框搜索结果页「使用过的小程序」列表
+         * - 1028:我的卡包
+         * - 1029:小程序中的卡券详情页
+         * - 1030:自动化测试下打开小程序
+         * - 1031:长按图片识别一维码
+         * - 1032:扫描手机相册中选取的一维码
+         * - 1034:微信支付完成页
+         * - 1035:公众号自定义菜单
+         * - 1036:App 分享消息卡片
+         * - 1037:小程序打开小程序
+         * - 1038:从另一个小程序返回
+         * - 1039:摇电视
+         * - 1042:添加好友搜索框的搜索结果页
+         * - 1043:公众号模板消息
+         * - 1044:带 shareTicket 的小程序消息卡片 [详情](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/share.html)
+         * - 1045:朋友圈广告
+         * - 1046:朋友圈广告详情页
+         * - 1047:扫描小程序码
+         * - 1048:长按图片识别小程序码
+         * - 1049:扫描手机相册中选取的小程序码
+         * - 1052:卡券的适用门店列表
+         * - 1053:搜一搜的结果页
+         * - 1054:顶部搜索框小程序快捷入口(微信客户端版本 6.7.4 起废弃)
+         * - 1056:聊天顶部音乐播放器右上角菜单
+         * - 1057:钱包中的银行卡详情页
+         * - 1058:公众号文章
+         * - 1059:体验版小程序绑定邀请页
+         * - 1060:微信支付完成页(与 1034 相同)
+         * - 1064:微信首页连 Wi-Fi 状态栏
+         * - 1065:URL scheme [详情](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/url-scheme.html)
+         * - 1067:公众号文章广告
+         * - 1068:附近小程序列表广告(已废弃)
+         * - 1069:移动应用通过 openSDK 进入微信,打开小程序
+         * - 1071:钱包中的银行卡列表页
+         * - 1072:二维码收款页面
+         * - 1073:客服消息列表下发的小程序消息卡片
+         * - 1074:公众号会话下发的小程序消息卡片
+         * - 1077:摇周边
+         * - 1078:微信连 Wi-Fi 成功提示页
+         * - 1079:微信游戏中心
+         * - 1081:客服消息下发的文字链
+         * - 1082:公众号会话下发的文字链
+         * - 1084:朋友圈广告原生页
+         * - 1088:会话中查看系统消息,打开小程序
+         * - 1089:微信聊天主界面下拉,「最近使用」栏(基础库 2.2.4 版本起包含「我的小程序」栏)
+         * - 1090:长按小程序右上角菜单唤出最近使用历史
+         * - 1091:公众号文章商品卡片
+         * - 1092:城市服务入口
+         * - 1095:小程序广告组件
+         * - 1096:聊天记录,打开小程序
+         * - 1097:微信支付签约原生页,打开小程序
+         * - 1099:页面内嵌插件
+         * - 1100:红包封面详情页打开小程序
+         * - 1101:远程调试热更新(开发者工具中,预览 -> 自动预览 -> 编译并预览)
+         * - 1102:公众号 profile 页服务预览
+         * - 1103:发现栏小程序主入口,「我的小程序」列表(基础库 2.2.4 版本起废弃)
+         * - 1104:微信聊天主界面下拉,「我的小程序」栏(基础库 2.2.4 版本起废弃)
+         * - 1106:聊天主界面下拉,从顶部搜索结果页,打开小程序
+         * - 1107:订阅消息,打开小程序
+         * - 1113:安卓手机负一屏,打开小程序(三星)
+         * - 1114:安卓手机侧边栏,打开小程序(三星)
+         * - 1119:【企业微信】工作台内打开小程序
+         * - 1120:【企业微信】个人资料页内打开小程序
+         * - 1121:【企业微信】聊天加号附件框内打开小程序
+         * - 1124:扫“一物一码”打开小程序
+         * - 1125:长按图片识别“一物一码”
+         * - 1126:扫描手机相册中选取的“一物一码”
+         * - 1129:微信爬虫访问 [详情](https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/sitemap.html)
+         * - 1131:浮窗(8.0 版本起仅包含被动浮窗)
+         * - 1133:硬件设备打开小程序 [详情](https://developers.weixin.qq.com/doc/oplatform/Miniprogram_Frame/)
+         * - 1135:小程序 profile 页相关小程序列表,打开小程序
+         * - 1144:公众号文章 - 视频贴片
+         * - 1145:发现栏 - 发现小程序
+         * - 1146:地理位置信息打开出行类小程序
+         * - 1148:卡包-交通卡,打开小程序
+         * - 1150:扫一扫商品条码结果页打开小程序
+         * - 1151:发现栏 - 我的订单
+         * - 1152:订阅号视频打开小程序
+         * - 1153:“识物”结果页打开小程序
+         * - 1154:朋友圈内打开“单页模式”
+         * - 1155:“单页模式”打开小程序
+         * - 1157:服务号会话页打开小程序
+         * - 1158:群工具打开小程序
+         * - 1160:群待办
+         * - 1167:H5 通过开放标签打开小程序 [详情](https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_Open_Tag.html)
+         * - 1168:移动应用直接运行小程序
+         * - 1169:发现栏小程序主入口,各个生活服务入口(例如快递服务、出行服务等)
+         * - 1171:微信运动记录(仅安卓)
+         * - 1173:聊天素材用小程序打开 [详情](https://developers.weixin.qq.com/miniprogram/dev/framework/material/support_material.html)
+         * - 1175:视频号主页商店入口
+         * - 1176:视频号直播间主播打开小程序
+         * - 1177:视频号直播商品
+         * - 1178:在电脑打开手机上打开的小程序
+         * - 1179:#话题页打开小程序
+         * - 1181:网站应用打开 PC 小程序
+         * - 1183:PC 微信 - 小程序面板 - 发现小程序 - 搜索
+         * - 1184:视频号链接打开小程序
+         * - 1185:群公告
+         * - 1186:收藏 - 笔记
+         * - 1187:浮窗(8.0 版本起)
+         * - 1189:表情雨广告
+         * - 1191:视频号活动
+         * - 1192:企业微信联系人 profile 页
+         * - 1193:视频号主页服务菜单打开小程序
+         * - 1194:URL Link [详情](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/url-link.html)
+         * - 1195:视频号主页商品 tab
+         * - 1196:个人状态打开小程序
+         * - 1197:视频号主播从直播间返回小游戏
+         * - 1198:视频号开播界面打开小游戏
+         * - 1200:视频号广告打开小程序
+         * - 1201:视频号广告详情页打开小程序
+         * - 1202:企微客服号会话打开小程序卡片
+         * - 1203:微信小程序压测工具的请求
+         * - 1206:视频号小游戏直播间打开小游戏
+         * - 1207:企微客服号会话打开小程序文字链
+         * - 1208:聊天打开商品卡片
+         * - 1212:青少年模式申请页打开小程序
+         * - 1215:广告预约打开小程序
+         * - 1216:视频号订单中心打开小程序
+         * - 1223:安卓桌面 Widget 打开小程序
+         * - 1228:视频号原生广告组件打开小程序
+         * - 1231:动态消息提醒入口打开小程序
+         */
+        scene: SceneValues
+        /** shareTicket,详见 [获取更多转发信息]((转发#获取更多转发信息)) */
+        shareTicket: string
+        /** 当场景为由从另一个小程序或公众号或App打开时,返回此字段 */
+        referrerInfo?: ReferrerInfo
+    }
+
+    interface PageNotFoundOption {
+        /** 不存在页面的路径 */
+        path: string
+        /** 打开不存在页面的 query */
+        query: IAnyObject
+        /** 是否本次启动的首个页面(例如从分享等入口进来,首个页面是开发者配置的分享页面) */
+        isEntryPage: boolean
+    }
+
+    interface Option {
+        /** 生命周期回调—监听小程序初始化
+         *
+         * 小程序初始化完成时触发,全局只触发一次。
+         */
+        onLaunch(options: LaunchShowOption): void
+        /** 生命周期回调—监听小程序显示
+         *
+         * 小程序启动,或从后台进入前台显示时
+         */
+        onShow(options: LaunchShowOption): void
+        /** 生命周期回调—监听小程序隐藏
+         *
+         * 小程序从前台进入后台时
+         */
+        onHide(): void
+        /** 错误监听函数
+         *
+         * 小程序发生脚本错误,或者 api
+         */
+        onError(/** 错误信息,包含堆栈 */ error: string): void
+        /** 页面不存在监听函数
+         *
+         * 小程序要打开的页面不存在时触发,会带上页面信息回调该函数
+         *
+         * **注意:**
+         * 1. 如果开发者没有添加 `onPageNotFound` 监听,当跳转页面不存在时,将推入微信客户端原生的页面不存在提示页面。
+         * 2. 如果 `onPageNotFound` 回调中又重定向到另一个不存在的页面,将推入微信客户端原生的页面不存在提示页面,并且不再回调 `onPageNotFound`。
+         *
+         * 最低基础库: 1.9.90
+         */
+        onPageNotFound(options: PageNotFoundOption): void
+        /**
+         * 小程序有未处理的 Promise 拒绝时触发。也可以使用 [wx.onUnhandledRejection](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.onUnhandledRejection.html) 绑定监听。注意事项请参考 [wx.onUnhandledRejection](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.onUnhandledRejection.html)。
+         * **参数**:与 [wx.onUnhandledRejection](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.onUnhandledRejection.html) 一致
+         */
+        onUnhandledRejection: OnUnhandledRejectionCallback
+        /**
+         * 系统切换主题时触发。也可以使用 wx.onThemeChange 绑定监听。
+         *
+         * 最低基础库: 2.11.0
+         */
+        onThemeChange: OnThemeChangeCallback
+    }
+
+    type Instance<T extends IAnyObject> = Option & T
+    type Options<T extends IAnyObject> = Partial<Option> &
+        T &
+        ThisType<Instance<T>>
+    type TrivialInstance = Instance<IAnyObject>
+
+    interface Constructor {
+        <T extends IAnyObject>(options: Options<T>): void
+    }
+
+    interface GetAppOption {
+        /** 在 `App` 未定义时返回默认实现。当App被调用时,默认实现中定义的属性会被覆盖合并到App中。一般用于独立分包
+         *
+         * 最低基础库: 2.2.4
+         */
+        allowDefault?: boolean
+    }
+
+    interface GetApp {
+        <T extends IAnyObject = IAnyObject>(opts?: GetAppOption): Instance<T>
+    }
+}
+
+declare let App: WechatMiniprogram.App.Constructor
+declare let getApp: WechatMiniprogram.App.GetApp

+ 68 - 0
typings/types/wx/lib.wx.behavior.d.ts

@@ -0,0 +1,68 @@
+/*! *****************************************************************************
+Copyright (c) 2022 Tencent, Inc. All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+***************************************************************************** */
+
+declare namespace WechatMiniprogram.Behavior {
+    type BehaviorIdentifier = string
+    type Instance<
+        TData extends DataOption,
+        TProperty extends PropertyOption,
+        TMethod extends MethodOption,
+        TCustomInstanceProperty extends IAnyObject = Record<string, never>
+    > = Component.Instance<TData, TProperty, TMethod, TCustomInstanceProperty>
+    type TrivialInstance = Instance<IAnyObject, IAnyObject, IAnyObject>
+    type TrivialOption = Options<IAnyObject, IAnyObject, IAnyObject>
+    type Options<
+        TData extends DataOption,
+        TProperty extends PropertyOption,
+        TMethod extends MethodOption,
+        TCustomInstanceProperty extends IAnyObject = Record<string, never>
+    > = Partial<Data<TData>> &
+        Partial<Property<TProperty>> &
+        Partial<Method<TMethod>> &
+        Partial<OtherOption> &
+        Partial<Lifetimes> &
+        ThisType<Instance<TData, TProperty, TMethod, TCustomInstanceProperty>>
+    interface Constructor {
+        <
+            TData extends DataOption,
+            TProperty extends PropertyOption,
+            TMethod extends MethodOption,
+            TCustomInstanceProperty extends IAnyObject = Record<string, never>
+        >(
+            options: Options<TData, TProperty, TMethod, TCustomInstanceProperty>
+        ): BehaviorIdentifier
+    }
+
+    type DataOption = Component.DataOption
+    type PropertyOption = Component.PropertyOption
+    type MethodOption = Component.MethodOption
+    type Data<D extends DataOption> = Component.Data<D>
+    type Property<P extends PropertyOption> = Component.Property<P>
+    type Method<M extends MethodOption> = Component.Method<M>
+
+    type DefinitionFilter = Component.DefinitionFilter
+    type Lifetimes = Component.Lifetimes
+
+    type OtherOption = Omit<Component.OtherOption, 'options'>
+}
+/** 注册一个 `behavior`,接受一个 `Object` 类型的参数。*/
+declare let Behavior: WechatMiniprogram.Behavior.Constructor

+ 979 - 0
typings/types/wx/lib.wx.cloud.d.ts

@@ -0,0 +1,979 @@
+/*! *****************************************************************************
+Copyright (c) 2022 Tencent, Inc. All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+***************************************************************************** */
+
+interface IAPIError {
+    errMsg: string
+}
+
+interface IAPIParam<T = any> {
+    config?: ICloudConfig
+    success?: (res: T) => void
+    fail?: (err: IAPIError) => void
+    complete?: (val: T | IAPIError) => void
+}
+
+interface IAPISuccessParam {
+    errMsg: string
+}
+
+type IAPICompleteParam = IAPISuccessParam | IAPIError
+
+type IAPIFunction<T, P extends IAPIParam<T>> = (param?: P) => Promise<T>
+
+interface IInitCloudConfig {
+    env?:
+        | string
+        | {
+              database?: string
+              functions?: string
+              storage?: string
+          }
+    traceUser?: boolean
+}
+
+interface ICloudConfig {
+    env?: string
+    traceUser?: boolean
+}
+
+interface IICloudAPI {
+    init: (config?: IInitCloudConfig) => void
+    [api: string]: AnyFunction | IAPIFunction<any, any>
+}
+
+interface ICloudService {
+    name: string
+
+    getAPIs: () => { [name: string]: IAPIFunction<any, any> }
+}
+
+interface ICloudServices {
+    [serviceName: string]: ICloudService
+}
+
+interface ICloudMetaData {
+    session_id: string
+}
+
+declare class InternalSymbol {}
+
+interface AnyObject {
+    [x: string]: any
+}
+
+type AnyArray = any[]
+
+type AnyFunction = (...args: any[]) => any
+
+/**
+ * extend wx with cloud
+ */
+interface WxCloud {
+    init: (config?: ICloudConfig) => void
+
+    callFunction(param: OQ<ICloud.CallFunctionParam>): void
+    callFunction(
+        param: RQ<ICloud.CallFunctionParam>
+    ): Promise<ICloud.CallFunctionResult>
+
+    uploadFile(param: OQ<ICloud.UploadFileParam>): WechatMiniprogram.UploadTask
+    uploadFile(
+        param: RQ<ICloud.UploadFileParam>
+    ): Promise<ICloud.UploadFileResult>
+
+    downloadFile(
+        param: OQ<ICloud.DownloadFileParam>
+    ): WechatMiniprogram.DownloadTask
+    downloadFile(
+        param: RQ<ICloud.DownloadFileParam>
+    ): Promise<ICloud.DownloadFileResult>
+
+    getTempFileURL(param: OQ<ICloud.GetTempFileURLParam>): void
+    getTempFileURL(
+        param: RQ<ICloud.GetTempFileURLParam>
+    ): Promise<ICloud.GetTempFileURLResult>
+
+    deleteFile(param: OQ<ICloud.DeleteFileParam>): void
+    deleteFile(
+        param: RQ<ICloud.DeleteFileParam>
+    ): Promise<ICloud.DeleteFileResult>
+
+    database: (config?: ICloudConfig) => DB.Database
+
+    CloudID: ICloud.ICloudIDConstructor
+    CDN: ICloud.ICDNConstructor
+
+    callContainer(param: OQ<ICloud.CallContainerParam>): void
+    callContainer(
+        param: RQ<ICloud.CallContainerParam>
+    ): Promise<ICloud.CallContainerResult>
+
+    connectContainer(param: OQ<ICloud.ConnectContainerParam>): void
+    connectContainer(
+        param: RQ<ICloud.ConnectContainerParam>
+    ): Promise<ICloud.ConnectContainerResult>
+}
+
+declare namespace ICloud {
+    interface ICloudAPIParam<T = any> extends IAPIParam<T> {
+        config?: ICloudConfig
+    }
+
+    // === API: callFunction ===
+    type CallFunctionData = AnyObject
+
+    interface CallFunctionResult extends IAPISuccessParam {
+        result: AnyObject | string | undefined
+    }
+
+    interface CallFunctionParam extends ICloudAPIParam<CallFunctionResult> {
+        name: string
+        data?: CallFunctionData
+        slow?: boolean
+    }
+    // === end ===
+
+    // === API: container ===
+    type CallContainerData = AnyObject
+
+    interface CallContainerResult extends IAPISuccessParam {
+        data: any
+        statusCode: number
+        header: Record<string, any>
+        callID: string
+    }
+
+    interface CallContainerParam extends ICloudAPIParam<CallContainerResult> {
+        path: string
+        service?: string
+        method?: string
+        header?: Record<string, any>
+        data?: any // string, object, ArrayBuffer
+        dataType?: string
+        responseType?: string
+        timeout?: number
+        verbose?: boolean
+        followRedirect?: boolean
+    }
+
+    interface ConnectContainerResult extends IAPISuccessParam {
+        socketTask: WechatMiniprogram.SocketTask
+    }
+
+    interface ConnectSocketOptions extends IAPIParam<void> {
+        header?: Record<string, string>
+        protocols?: string[]
+        tcpNoDelay?: boolean
+        perMessageDeflate?: boolean
+        timeout?: number
+    }
+
+    type ConnectContainerParam = Omit<
+        ConnectSocketOptions,
+        'success' | 'fail' | 'complete'
+    > &
+        ICloudAPIParam<ConnectContainerResult> & {
+            service: string
+            path?: string
+        }
+    // === end ===
+
+    // === API: uploadFile ===
+    interface UploadFileResult extends IAPISuccessParam {
+        fileID: string
+        statusCode: number
+    }
+
+    interface UploadFileParam extends ICloudAPIParam<UploadFileResult> {
+        cloudPath: string
+        filePath: string
+        header?: AnyObject
+    }
+    // === end ===
+
+    // === API: downloadFile ===
+    interface DownloadFileResult extends IAPISuccessParam {
+        tempFilePath: string
+        statusCode: number
+    }
+
+    interface DownloadFileParam extends ICloudAPIParam<DownloadFileResult> {
+        fileID: string
+        cloudPath?: string
+    }
+    // === end ===
+
+    // === API: getTempFileURL ===
+    interface GetTempFileURLResult extends IAPISuccessParam {
+        fileList: GetTempFileURLResultItem[]
+    }
+
+    interface GetTempFileURLResultItem {
+        fileID: string
+        tempFileURL: string
+        maxAge: number
+        status: number
+        errMsg: string
+    }
+
+    interface GetTempFileURLParam extends ICloudAPIParam<GetTempFileURLResult> {
+        fileList: string[]
+    }
+    // === end ===
+
+    // === API: deleteFile ===
+    interface DeleteFileResult extends IAPISuccessParam {
+        fileList: DeleteFileResultItem[]
+    }
+
+    interface DeleteFileResultItem {
+        fileID: string
+        status: number
+        errMsg: string
+    }
+
+    interface DeleteFileParam extends ICloudAPIParam<DeleteFileResult> {
+        fileList: string[]
+    }
+    // === end ===
+
+    // === API: CloudID ===
+    abstract class CloudID {
+        constructor(cloudID: string)
+    }
+
+    interface ICloudIDConstructor {
+        new (cloudId: string): CloudID
+        (cloudId: string): CloudID
+    }
+    // === end ===
+
+    // === API: CDN ===
+    abstract class CDN {
+        target: string | ArrayBuffer | ICDNFilePathSpec
+        constructor(target: string | ArrayBuffer | ICDNFilePathSpec)
+    }
+
+    interface ICDNFilePathSpec {
+        type: 'filePath'
+        filePath: string
+    }
+
+    interface ICDNConstructor {
+        new (options: string | ArrayBuffer | ICDNFilePathSpec): CDN
+        (options: string | ArrayBuffer | ICDNFilePathSpec): CDN
+    }
+    // === end ===
+}
+
+// === Database ===
+declare namespace DB {
+    /**
+     * The class of all exposed cloud database instances
+     */
+    class Database {
+        readonly config: ICloudConfig
+        readonly command: DatabaseCommand
+        readonly Geo: IGeo
+        readonly serverDate: () => ServerDate
+        readonly RegExp: IRegExpConstructor
+
+        private constructor()
+
+        collection(collectionName: string): CollectionReference
+    }
+
+    class CollectionReference extends Query {
+        readonly collectionName: string
+
+        private constructor(name: string, database: Database)
+
+        doc(docId: string | number): DocumentReference
+
+        add(options: OQ<IAddDocumentOptions>): void
+        add(options: RQ<IAddDocumentOptions>): Promise<IAddResult>
+    }
+
+    class DocumentReference {
+        private constructor(docId: string | number, database: Database)
+
+        field(object: Record<string, any>): this
+
+        get(options: OQ<IGetDocumentOptions>): void
+        get(options?: RQ<IGetDocumentOptions>): Promise<IQuerySingleResult>
+
+        set(options: OQ<ISetSingleDocumentOptions>): void
+        set(options?: RQ<ISetSingleDocumentOptions>): Promise<ISetResult>
+
+        update(options: OQ<IUpdateSingleDocumentOptions>): void
+        update(
+            options?: RQ<IUpdateSingleDocumentOptions>
+        ): Promise<IUpdateResult>
+
+        remove(options: OQ<IRemoveSingleDocumentOptions>): void
+        remove(
+            options?: RQ<IRemoveSingleDocumentOptions>
+        ): Promise<IRemoveResult>
+
+        watch(options: IWatchOptions): RealtimeListener
+    }
+
+    class RealtimeListener {
+        // "And Now His Watch Is Ended"
+        close: () => Promise<void>
+    }
+
+    class Query {
+        where(condition: IQueryCondition): Query
+
+        orderBy(fieldPath: string, order: string): Query
+
+        limit(max: number): Query
+
+        skip(offset: number): Query
+
+        field(object: Record<string, any>): Query
+
+        get(options: OQ<IGetDocumentOptions>): void
+        get(options?: RQ<IGetDocumentOptions>): Promise<IQueryResult>
+
+        count(options: OQ<ICountDocumentOptions>): void
+        count(options?: RQ<ICountDocumentOptions>): Promise<ICountResult>
+
+        watch(options: IWatchOptions): RealtimeListener
+    }
+
+    interface DatabaseCommand {
+        eq(val: any): DatabaseQueryCommand
+        neq(val: any): DatabaseQueryCommand
+        gt(val: any): DatabaseQueryCommand
+        gte(val: any): DatabaseQueryCommand
+        lt(val: any): DatabaseQueryCommand
+        lte(val: any): DatabaseQueryCommand
+        in(val: any[]): DatabaseQueryCommand
+        nin(val: any[]): DatabaseQueryCommand
+
+        geoNear(options: IGeoNearCommandOptions): DatabaseQueryCommand
+        geoWithin(options: IGeoWithinCommandOptions): DatabaseQueryCommand
+        geoIntersects(
+            options: IGeoIntersectsCommandOptions
+        ): DatabaseQueryCommand
+
+        and(
+            ...expressions: Array<DatabaseLogicCommand | IQueryCondition>
+        ): DatabaseLogicCommand
+        or(
+            ...expressions: Array<DatabaseLogicCommand | IQueryCondition>
+        ): DatabaseLogicCommand
+        nor(
+            ...expressions: Array<DatabaseLogicCommand | IQueryCondition>
+        ): DatabaseLogicCommand
+        not(expression: DatabaseLogicCommand): DatabaseLogicCommand
+
+        exists(val: boolean): DatabaseQueryCommand
+
+        mod(divisor: number, remainder: number): DatabaseQueryCommand
+
+        all(val: any[]): DatabaseQueryCommand
+        elemMatch(val: any): DatabaseQueryCommand
+        size(val: number): DatabaseQueryCommand
+
+        set(val: any): DatabaseUpdateCommand
+        remove(): DatabaseUpdateCommand
+        inc(val: number): DatabaseUpdateCommand
+        mul(val: number): DatabaseUpdateCommand
+        min(val: number): DatabaseUpdateCommand
+        max(val: number): DatabaseUpdateCommand
+        rename(val: string): DatabaseUpdateCommand
+        bit(val: number): DatabaseUpdateCommand
+
+        push(...values: any[]): DatabaseUpdateCommand
+        pop(): DatabaseUpdateCommand
+        shift(): DatabaseUpdateCommand
+        unshift(...values: any[]): DatabaseUpdateCommand
+        addToSet(val: any): DatabaseUpdateCommand
+        pull(val: any): DatabaseUpdateCommand
+        pullAll(val: any): DatabaseUpdateCommand
+
+        project: {
+            slice(val: number | [number, number]): DatabaseProjectionCommand
+        }
+
+        aggregate: {
+            __safe_props__?: Set<string>
+
+            abs(val: any): DatabaseAggregateCommand
+            add(val: any): DatabaseAggregateCommand
+            addToSet(val: any): DatabaseAggregateCommand
+            allElementsTrue(val: any): DatabaseAggregateCommand
+            and(val: any): DatabaseAggregateCommand
+            anyElementTrue(val: any): DatabaseAggregateCommand
+            arrayElemAt(val: any): DatabaseAggregateCommand
+            arrayToObject(val: any): DatabaseAggregateCommand
+            avg(val: any): DatabaseAggregateCommand
+            ceil(val: any): DatabaseAggregateCommand
+            cmp(val: any): DatabaseAggregateCommand
+            concat(val: any): DatabaseAggregateCommand
+            concatArrays(val: any): DatabaseAggregateCommand
+            cond(val: any): DatabaseAggregateCommand
+            convert(val: any): DatabaseAggregateCommand
+            dateFromParts(val: any): DatabaseAggregateCommand
+            dateToParts(val: any): DatabaseAggregateCommand
+            dateFromString(val: any): DatabaseAggregateCommand
+            dateToString(val: any): DatabaseAggregateCommand
+            dayOfMonth(val: any): DatabaseAggregateCommand
+            dayOfWeek(val: any): DatabaseAggregateCommand
+            dayOfYear(val: any): DatabaseAggregateCommand
+            divide(val: any): DatabaseAggregateCommand
+            eq(val: any): DatabaseAggregateCommand
+            exp(val: any): DatabaseAggregateCommand
+            filter(val: any): DatabaseAggregateCommand
+            first(val: any): DatabaseAggregateCommand
+            floor(val: any): DatabaseAggregateCommand
+            gt(val: any): DatabaseAggregateCommand
+            gte(val: any): DatabaseAggregateCommand
+            hour(val: any): DatabaseAggregateCommand
+            ifNull(val: any): DatabaseAggregateCommand
+            in(val: any): DatabaseAggregateCommand
+            indexOfArray(val: any): DatabaseAggregateCommand
+            indexOfBytes(val: any): DatabaseAggregateCommand
+            indexOfCP(val: any): DatabaseAggregateCommand
+            isArray(val: any): DatabaseAggregateCommand
+            isoDayOfWeek(val: any): DatabaseAggregateCommand
+            isoWeek(val: any): DatabaseAggregateCommand
+            isoWeekYear(val: any): DatabaseAggregateCommand
+            last(val: any): DatabaseAggregateCommand
+            let(val: any): DatabaseAggregateCommand
+            literal(val: any): DatabaseAggregateCommand
+            ln(val: any): DatabaseAggregateCommand
+            log(val: any): DatabaseAggregateCommand
+            log10(val: any): DatabaseAggregateCommand
+            lt(val: any): DatabaseAggregateCommand
+            lte(val: any): DatabaseAggregateCommand
+            ltrim(val: any): DatabaseAggregateCommand
+            map(val: any): DatabaseAggregateCommand
+            max(val: any): DatabaseAggregateCommand
+            mergeObjects(val: any): DatabaseAggregateCommand
+            meta(val: any): DatabaseAggregateCommand
+            min(val: any): DatabaseAggregateCommand
+            millisecond(val: any): DatabaseAggregateCommand
+            minute(val: any): DatabaseAggregateCommand
+            mod(val: any): DatabaseAggregateCommand
+            month(val: any): DatabaseAggregateCommand
+            multiply(val: any): DatabaseAggregateCommand
+            neq(val: any): DatabaseAggregateCommand
+            not(val: any): DatabaseAggregateCommand
+            objectToArray(val: any): DatabaseAggregateCommand
+            or(val: any): DatabaseAggregateCommand
+            pow(val: any): DatabaseAggregateCommand
+            push(val: any): DatabaseAggregateCommand
+            range(val: any): DatabaseAggregateCommand
+            reduce(val: any): DatabaseAggregateCommand
+            reverseArray(val: any): DatabaseAggregateCommand
+            rtrim(val: any): DatabaseAggregateCommand
+            second(val: any): DatabaseAggregateCommand
+            setDifference(val: any): DatabaseAggregateCommand
+            setEquals(val: any): DatabaseAggregateCommand
+            setIntersection(val: any): DatabaseAggregateCommand
+            setIsSubset(val: any): DatabaseAggregateCommand
+            setUnion(val: any): DatabaseAggregateCommand
+            size(val: any): DatabaseAggregateCommand
+            slice(val: any): DatabaseAggregateCommand
+            split(val: any): DatabaseAggregateCommand
+            sqrt(val: any): DatabaseAggregateCommand
+            stdDevPop(val: any): DatabaseAggregateCommand
+            stdDevSamp(val: any): DatabaseAggregateCommand
+            strcasecmp(val: any): DatabaseAggregateCommand
+            strLenBytes(val: any): DatabaseAggregateCommand
+            strLenCP(val: any): DatabaseAggregateCommand
+            substr(val: any): DatabaseAggregateCommand
+            substrBytes(val: any): DatabaseAggregateCommand
+            substrCP(val: any): DatabaseAggregateCommand
+            subtract(val: any): DatabaseAggregateCommand
+            sum(val: any): DatabaseAggregateCommand
+            switch(val: any): DatabaseAggregateCommand
+            toBool(val: any): DatabaseAggregateCommand
+            toDate(val: any): DatabaseAggregateCommand
+            toDecimal(val: any): DatabaseAggregateCommand
+            toDouble(val: any): DatabaseAggregateCommand
+            toInt(val: any): DatabaseAggregateCommand
+            toLong(val: any): DatabaseAggregateCommand
+            toObjectId(val: any): DatabaseAggregateCommand
+            toString(val: any): DatabaseAggregateCommand
+            toLower(val: any): DatabaseAggregateCommand
+            toUpper(val: any): DatabaseAggregateCommand
+            trim(val: any): DatabaseAggregateCommand
+            trunc(val: any): DatabaseAggregateCommand
+            type(val: any): DatabaseAggregateCommand
+            week(val: any): DatabaseAggregateCommand
+            year(val: any): DatabaseAggregateCommand
+            zip(val: any): DatabaseAggregateCommand
+        }
+    }
+
+    class DatabaseAggregateCommand {}
+
+    enum LOGIC_COMMANDS_LITERAL {
+        AND = 'and',
+        OR = 'or',
+        NOT = 'not',
+        NOR = 'nor'
+    }
+
+    class DatabaseLogicCommand {
+        and(...expressions: DatabaseLogicCommand[]): DatabaseLogicCommand
+        or(...expressions: DatabaseLogicCommand[]): DatabaseLogicCommand
+        nor(...expressions: DatabaseLogicCommand[]): DatabaseLogicCommand
+        not(expression: DatabaseLogicCommand): DatabaseLogicCommand
+    }
+
+    enum QUERY_COMMANDS_LITERAL {
+        // comparison
+        EQ = 'eq',
+        NEQ = 'neq',
+        GT = 'gt',
+        GTE = 'gte',
+        LT = 'lt',
+        LTE = 'lte',
+        IN = 'in',
+        NIN = 'nin',
+        // geo
+        GEO_NEAR = 'geoNear',
+        GEO_WITHIN = 'geoWithin',
+        GEO_INTERSECTS = 'geoIntersects',
+        // element
+        EXISTS = 'exists',
+        // evaluation
+        MOD = 'mod',
+        // array
+        ALL = 'all',
+        ELEM_MATCH = 'elemMatch',
+        SIZE = 'size'
+    }
+
+    class DatabaseQueryCommand extends DatabaseLogicCommand {
+        eq(val: any): DatabaseLogicCommand
+        neq(val: any): DatabaseLogicCommand
+        gt(val: any): DatabaseLogicCommand
+        gte(val: any): DatabaseLogicCommand
+        lt(val: any): DatabaseLogicCommand
+        lte(val: any): DatabaseLogicCommand
+        in(val: any[]): DatabaseLogicCommand
+        nin(val: any[]): DatabaseLogicCommand
+
+        exists(val: boolean): DatabaseLogicCommand
+
+        mod(divisor: number, remainder: number): DatabaseLogicCommand
+
+        all(val: any[]): DatabaseLogicCommand
+        elemMatch(val: any): DatabaseLogicCommand
+        size(val: number): DatabaseLogicCommand
+
+        geoNear(options: IGeoNearCommandOptions): DatabaseLogicCommand
+        geoWithin(options: IGeoWithinCommandOptions): DatabaseLogicCommand
+        geoIntersects(
+            options: IGeoIntersectsCommandOptions
+        ): DatabaseLogicCommand
+    }
+
+    enum PROJECTION_COMMANDS_LITERAL {
+        SLICE = 'slice'
+    }
+
+    class DatabaseProjectionCommand {}
+
+    enum UPDATE_COMMANDS_LITERAL {
+        // field
+        SET = 'set',
+        REMOVE = 'remove',
+        INC = 'inc',
+        MUL = 'mul',
+        MIN = 'min',
+        MAX = 'max',
+        RENAME = 'rename',
+        // bitwise
+        BIT = 'bit',
+        // array
+        PUSH = 'push',
+        POP = 'pop',
+        SHIFT = 'shift',
+        UNSHIFT = 'unshift',
+        ADD_TO_SET = 'addToSet',
+        PULL = 'pull',
+        PULL_ALL = 'pullAll'
+    }
+
+    class DatabaseUpdateCommand {}
+
+    class Batch {}
+
+    /**
+     * A contract that all API provider must adhere to
+     */
+    class APIBaseContract<
+        PromiseReturn,
+        CallbackReturn,
+        Param extends IAPIParam,
+        Context = any
+    > {
+        getContext(param: Param): Context
+
+        /**
+         * In case of callback-style invocation, this function will be called
+         */
+        getCallbackReturn(param: Param, context: Context): CallbackReturn
+
+        getFinalParam<T extends Param>(param: Param, context: Context): T
+
+        run<T extends Param>(param: T): Promise<PromiseReturn>
+    }
+
+    interface IGeoPointConstructor {
+        new (longitude: number, latitide: number): GeoPoint
+        new (geojson: IGeoJSONPoint): GeoPoint
+        (longitude: number, latitide: number): GeoPoint
+        (geojson: IGeoJSONPoint): GeoPoint
+    }
+
+    interface IGeoMultiPointConstructor {
+        new (points: GeoPoint[] | IGeoJSONMultiPoint): GeoMultiPoint
+        (points: GeoPoint[] | IGeoJSONMultiPoint): GeoMultiPoint
+    }
+
+    interface IGeoLineStringConstructor {
+        new (points: GeoPoint[] | IGeoJSONLineString): GeoLineString
+        (points: GeoPoint[] | IGeoJSONLineString): GeoLineString
+    }
+
+    interface IGeoMultiLineStringConstructor {
+        new (
+            lineStrings: GeoLineString[] | IGeoJSONMultiLineString
+        ): GeoMultiLineString
+        (
+            lineStrings: GeoLineString[] | IGeoJSONMultiLineString
+        ): GeoMultiLineString
+    }
+
+    interface IGeoPolygonConstructor {
+        new (lineStrings: GeoLineString[] | IGeoJSONPolygon): GeoPolygon
+        (lineStrings: GeoLineString[] | IGeoJSONPolygon): GeoPolygon
+    }
+
+    interface IGeoMultiPolygonConstructor {
+        new (polygons: GeoPolygon[] | IGeoJSONMultiPolygon): GeoMultiPolygon
+        (polygons: GeoPolygon[] | IGeoJSONMultiPolygon): GeoMultiPolygon
+    }
+
+    interface IGeo {
+        Point: IGeoPointConstructor
+        MultiPoint: IGeoMultiPointConstructor
+        LineString: IGeoLineStringConstructor
+        MultiLineString: IGeoMultiLineStringConstructor
+        Polygon: IGeoPolygonConstructor
+        MultiPolygon: IGeoMultiPolygonConstructor
+    }
+
+    interface IGeoJSONPoint {
+        type: 'Point'
+        coordinates: [number, number]
+    }
+
+    interface IGeoJSONMultiPoint {
+        type: 'MultiPoint'
+        coordinates: Array<[number, number]>
+    }
+
+    interface IGeoJSONLineString {
+        type: 'LineString'
+        coordinates: Array<[number, number]>
+    }
+
+    interface IGeoJSONMultiLineString {
+        type: 'MultiLineString'
+        coordinates: Array<Array<[number, number]>>
+    }
+
+    interface IGeoJSONPolygon {
+        type: 'Polygon'
+        coordinates: Array<Array<[number, number]>>
+    }
+
+    interface IGeoJSONMultiPolygon {
+        type: 'MultiPolygon'
+        coordinates: Array<Array<Array<[number, number]>>>
+    }
+
+    type IGeoJSONObject =
+        | IGeoJSONPoint
+        | IGeoJSONMultiPoint
+        | IGeoJSONLineString
+        | IGeoJSONMultiLineString
+        | IGeoJSONPolygon
+        | IGeoJSONMultiPolygon
+
+    abstract class GeoPoint {
+        longitude: number
+        latitude: number
+
+        constructor(longitude: number, latitude: number)
+
+        toJSON(): Record<string, any>
+        toString(): string
+    }
+
+    abstract class GeoMultiPoint {
+        points: GeoPoint[]
+
+        constructor(points: GeoPoint[])
+
+        toJSON(): IGeoJSONMultiPoint
+        toString(): string
+    }
+
+    abstract class GeoLineString {
+        points: GeoPoint[]
+
+        constructor(points: GeoPoint[])
+
+        toJSON(): IGeoJSONLineString
+        toString(): string
+    }
+
+    abstract class GeoMultiLineString {
+        lines: GeoLineString[]
+
+        constructor(lines: GeoLineString[])
+
+        toJSON(): IGeoJSONMultiLineString
+        toString(): string
+    }
+
+    abstract class GeoPolygon {
+        lines: GeoLineString[]
+
+        constructor(lines: GeoLineString[])
+
+        toJSON(): IGeoJSONPolygon
+        toString(): string
+    }
+
+    abstract class GeoMultiPolygon {
+        polygons: GeoPolygon[]
+
+        constructor(polygons: GeoPolygon[])
+
+        toJSON(): IGeoJSONMultiPolygon
+        toString(): string
+    }
+
+    type GeoInstance =
+        | GeoPoint
+        | GeoMultiPoint
+        | GeoLineString
+        | GeoMultiLineString
+        | GeoPolygon
+        | GeoMultiPolygon
+
+    interface IGeoNearCommandOptions {
+        geometry: GeoPoint
+        maxDistance?: number
+        minDistance?: number
+    }
+
+    interface IGeoWithinCommandOptions {
+        geometry: GeoPolygon | GeoMultiPolygon
+    }
+
+    interface IGeoIntersectsCommandOptions {
+        geometry:
+            | GeoPoint
+            | GeoMultiPoint
+            | GeoLineString
+            | GeoMultiLineString
+            | GeoPolygon
+            | GeoMultiPolygon
+    }
+
+    interface IServerDateOptions {
+        offset: number
+    }
+
+    abstract class ServerDate {
+        readonly options: IServerDateOptions
+        constructor(options?: IServerDateOptions)
+    }
+
+    interface IRegExpOptions {
+        regexp: string
+        options?: string
+    }
+
+    interface IRegExpConstructor {
+        new (options: IRegExpOptions): RegExp
+        (options: IRegExpOptions): RegExp
+    }
+
+    abstract class RegExp {
+        readonly regexp: string
+        readonly options: string
+        constructor(options: IRegExpOptions)
+    }
+
+    type DocumentId = string | number
+
+    interface IDocumentData {
+        _id?: DocumentId
+        [key: string]: any
+    }
+
+    type IDBAPIParam = IAPIParam
+
+    interface IAddDocumentOptions extends IDBAPIParam {
+        data: IDocumentData
+    }
+
+    type IGetDocumentOptions = IDBAPIParam
+
+    type ICountDocumentOptions = IDBAPIParam
+
+    interface IUpdateDocumentOptions extends IDBAPIParam {
+        data: IUpdateCondition
+    }
+
+    interface IUpdateSingleDocumentOptions extends IDBAPIParam {
+        data: IUpdateCondition
+    }
+
+    interface ISetDocumentOptions extends IDBAPIParam {
+        data: IUpdateCondition
+    }
+
+    interface ISetSingleDocumentOptions extends IDBAPIParam {
+        data: IUpdateCondition
+    }
+
+    interface IRemoveDocumentOptions extends IDBAPIParam {
+        query: IQueryCondition
+    }
+
+    type IRemoveSingleDocumentOptions = IDBAPIParam
+
+    interface IWatchOptions {
+        // server realtime data init & change event
+        onChange: (snapshot: ISnapshot) => void
+        // error while connecting / listening
+        onError: (error: any) => void
+    }
+
+    interface ISnapshot {
+        id: number
+        docChanges: ISingleDBEvent[]
+        docs: Record<string, any>
+        type?: SnapshotType
+    }
+
+    type SnapshotType = 'init'
+
+    interface ISingleDBEvent {
+        id: number
+        dataType: DataType
+        queueType: QueueType
+        docId: string
+        doc: Record<string, any>
+        updatedFields?: Record<string, any>
+        removedFields?: string[]
+    }
+
+    type DataType = 'init' | 'update' | 'replace' | 'add' | 'remove' | 'limit'
+
+    type QueueType = 'init' | 'enqueue' | 'dequeue' | 'update'
+
+    interface IQueryCondition {
+        [key: string]: any
+    }
+
+    type IStringQueryCondition = string
+
+    interface IQueryResult extends IAPISuccessParam {
+        data: IDocumentData[]
+    }
+
+    interface IQuerySingleResult extends IAPISuccessParam {
+        data: IDocumentData
+    }
+
+    interface IUpdateCondition {
+        [key: string]: any
+    }
+
+    type IStringUpdateCondition = string
+
+    interface IAddResult extends IAPISuccessParam {
+        _id: DocumentId
+    }
+
+    interface IUpdateResult extends IAPISuccessParam {
+        stats: {
+            updated: number
+            // created: number,
+        }
+    }
+
+    interface ISetResult extends IAPISuccessParam {
+        _id: DocumentId
+        stats: {
+            updated: number
+            created: number
+        }
+    }
+
+    interface IRemoveResult extends IAPISuccessParam {
+        stats: {
+            removed: number
+        }
+    }
+
+    interface ICountResult extends IAPISuccessParam {
+        total: number
+    }
+}
+
+type Optional<T> = { [K in keyof T]+?: T[K] }
+
+type OQ<
+    T extends Optional<
+        Record<'complete' | 'success' | 'fail', (...args: any[]) => any>
+    >
+> =
+    | (RQ<T> & Required<Pick<T, 'success'>>)
+    | (RQ<T> & Required<Pick<T, 'fail'>>)
+    | (RQ<T> & Required<Pick<T, 'complete'>>)
+    | (RQ<T> & Required<Pick<T, 'success' | 'fail'>>)
+    | (RQ<T> & Required<Pick<T, 'success' | 'complete'>>)
+    | (RQ<T> & Required<Pick<T, 'fail' | 'complete'>>)
+    | (RQ<T> & Required<Pick<T, 'fail' | 'complete' | 'success'>>)
+
+type RQ<
+    T extends Optional<
+        Record<'complete' | 'success' | 'fail', (...args: any[]) => any>
+    >
+> = Pick<T, Exclude<keyof T, 'complete' | 'success' | 'fail'>>

+ 676 - 0
typings/types/wx/lib.wx.component.d.ts

@@ -0,0 +1,676 @@
+/*! *****************************************************************************
+Copyright (c) 2022 Tencent, Inc. All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+***************************************************************************** */
+
+declare namespace WechatMiniprogram.Component {
+    type Instance<
+        TData extends DataOption,
+        TProperty extends PropertyOption,
+        TMethod extends Partial<MethodOption>,
+        TCustomInstanceProperty extends IAnyObject = {},
+        TIsPage extends boolean = false
+    > = InstanceProperties &
+        InstanceMethods<TData> &
+        TMethod &
+        (TIsPage extends true ? Page.ILifetime : {}) &
+        TCustomInstanceProperty & {
+            /** 组件数据,**包括内部数据和属性值** */
+            data: TData & PropertyOptionToData<TProperty>
+            /** 组件数据,**包括内部数据和属性值**(与 `data` 一致) */
+            properties: TData & PropertyOptionToData<TProperty>
+        }
+    type TrivialInstance = Instance<
+        IAnyObject,
+        IAnyObject,
+        IAnyObject,
+        IAnyObject
+    >
+    type TrivialOption = Options<IAnyObject, IAnyObject, IAnyObject, IAnyObject>
+    type Options<
+        TData extends DataOption,
+        TProperty extends PropertyOption,
+        TMethod extends MethodOption,
+        TCustomInstanceProperty extends IAnyObject = {},
+        TIsPage extends boolean = false
+    > = Partial<Data<TData>> &
+        Partial<Property<TProperty>> &
+        Partial<Method<TMethod, TIsPage>> &
+        Partial<OtherOption> &
+        Partial<Lifetimes> &
+        ThisType<
+            Instance<
+                TData,
+                TProperty,
+                TMethod,
+                TCustomInstanceProperty,
+                TIsPage
+            >
+        >
+    interface Constructor {
+        <
+            TData extends DataOption,
+            TProperty extends PropertyOption,
+            TMethod extends MethodOption,
+            TCustomInstanceProperty extends IAnyObject = {},
+            TIsPage extends boolean = false
+        >(
+            options: Options<
+                TData,
+                TProperty,
+                TMethod,
+                TCustomInstanceProperty,
+                TIsPage
+            >
+        ): string
+    }
+    type DataOption = Record<string, any>
+    type PropertyOption = Record<string, AllProperty>
+    type MethodOption = Record<string, Function>
+
+    interface Data<D extends DataOption> {
+        /** 组件的内部数据,和 `properties` 一同用于组件的模板渲染 */
+        data?: D
+    }
+    interface Property<P extends PropertyOption> {
+        /** 组件的对外属性,是属性名到属性设置的映射表 */
+        properties: P
+    }
+    interface Method<M extends MethodOption, TIsPage extends boolean = false> {
+        /** 组件的方法,包括事件响应函数和任意的自定义方法,关于事件响应函数的使用,参见 [组件间通信与事件](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html) */
+        methods: M & (TIsPage extends true ? Partial<Page.ILifetime> : {})
+    }
+    type PropertyType =
+        | StringConstructor
+        | NumberConstructor
+        | BooleanConstructor
+        | ArrayConstructor
+        | ObjectConstructor
+        | null
+    type ValueType<T extends PropertyType> = T extends null
+        ? any
+        : T extends StringConstructor
+        ? string
+        : T extends NumberConstructor
+        ? number
+        : T extends BooleanConstructor
+        ? boolean
+        : T extends ArrayConstructor
+        ? any[]
+        : T extends ObjectConstructor
+        ? IAnyObject
+        : never
+    type FullProperty<T extends PropertyType> = {
+        /** 属性类型 */
+        type: T
+        /** 属性初始值 */
+        value?: ValueType<T>
+        /** 属性值被更改时的响应函数 */
+        observer?:
+            | string
+            | ((
+                  newVal: ValueType<T>,
+                  oldVal: ValueType<T>,
+                  changedPath: Array<string | number>
+              ) => void)
+        /** 属性的类型(可以指定多个) */
+        optionalTypes?: ShortProperty[]
+    }
+    type AllFullProperty =
+        | FullProperty<StringConstructor>
+        | FullProperty<NumberConstructor>
+        | FullProperty<BooleanConstructor>
+        | FullProperty<ArrayConstructor>
+        | FullProperty<ObjectConstructor>
+        | FullProperty<null>
+    type ShortProperty =
+        | StringConstructor
+        | NumberConstructor
+        | BooleanConstructor
+        | ArrayConstructor
+        | ObjectConstructor
+        | null
+    type AllProperty = AllFullProperty | ShortProperty
+    type PropertyToData<T extends AllProperty> = T extends ShortProperty
+        ? ValueType<T>
+        : FullPropertyToData<Exclude<T, ShortProperty>>
+    type FullPropertyToData<T extends AllFullProperty> = ValueType<T['type']>
+    // type FullPropertyToData<T extends AllFullProperty> = unknown extends T['value'] ? ValueType<T['type']> : T['value']
+    type PropertyOptionToData<P extends PropertyOption> = {
+        [name in keyof P]: PropertyToData<P[name]>
+    }
+
+    interface InstanceProperties {
+        /** 组件的文件路径 */
+        is: string
+        /** 节点id */
+        id: string
+        /** 节点dataset */
+        dataset: Record<string, string>
+    }
+
+    interface InstanceMethods<D extends DataOption> {
+        /** `setData` 函数用于将数据从逻辑层发送到视图层
+         *(异步),同时改变对应的 `this.data` 的值(同步)。
+         *
+         * **注意:**
+         *
+         * 1. **直接修改 this.data 而不调用 this.setData 是无法改变页面的状态的,还会造成数据不一致**。
+         * 1. 仅支持设置可 JSON 化的数据。
+         * 1. 单次设置的数据不能超过1024kB,请尽量避免一次设置过多的数据。
+         * 1. 请不要把 data 中任何一项的 value 设为 `undefined` ,否则这一项将不被设置并可能遗留一些潜在问题。
+         */
+        setData(
+            /** 这次要改变的数据
+             *
+             * 以 `key: value` 的形式表示,将 `this.data` 中的 `key` 对应的值改变成 `value`。
+             *
+             * 其中 `key` 可以以数据路径的形式给出,支持改变数组中的某一项或对象的某个属性,如 `array[2].message`,`a.b.c.d`,并且不需要在 this.data 中预先定义。
+             */
+            data: Partial<D> & IAnyObject,
+            /** setData引起的界面更新渲染完毕后的回调函数,最低基础库: `1.5.0` */
+            callback?: () => void
+        ): void
+
+        /** 检查组件是否具有 `behavior` (检查时会递归检查被直接或间接引入的所有behavior) */
+        hasBehavior(behavior: Behavior.BehaviorIdentifier): void
+        /** 触发事件,参见组件事件 */
+        triggerEvent<DetailType = any>(
+            name: string,
+            detail?: DetailType,
+            options?: TriggerEventOption
+        ): void
+        /** 创建一个 SelectorQuery 对象,选择器选取范围为这个组件实例内 */
+        createSelectorQuery(): SelectorQuery
+        /** 创建一个 IntersectionObserver 对象,选择器选取范围为这个组件实例内 */
+        createIntersectionObserver(
+            options: CreateIntersectionObserverOption
+        ): IntersectionObserver
+        /** 使用选择器选择组件实例节点,返回匹配到的第一个组件实例对象(会被 `wx://component-export` 影响) */
+        selectComponent(selector: string): TrivialInstance
+        /** 使用选择器选择组件实例节点,返回匹配到的全部组件实例对象组成的数组 */
+        selectAllComponents(selector: string): TrivialInstance[]
+        /**
+         * 选取当前组件节点所在的组件实例(即组件的引用者),返回它的组件实例对象(会被 `wx://component-export` 影响)
+         *
+         * 最低基础库版本:[`2.8.2`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html)
+         **/
+        selectOwnerComponent(): TrivialInstance
+        /** 获取这个关系所对应的所有关联节点,参见 组件间关系 */
+        getRelationNodes(relationKey: string): TrivialInstance[]
+        /**
+         * 立刻执行 callback ,其中的多个 setData 之间不会触发界面绘制(只有某些特殊场景中需要,如用于在不同组件同时 setData 时进行界面绘制同步)
+         *
+         * 最低基础库版本:[`2.4.0`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html)
+         **/
+        groupSetData(callback?: () => void): void
+        /**
+         * 返回当前页面的 custom-tab-bar 的组件实例
+         *
+         * 最低基础库版本:[`2.6.2`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html)
+         **/
+        getTabBar(): TrivialInstance
+        /**
+         * 返回页面标识符(一个字符串),可以用来判断几个自定义组件实例是不是在同一个页面内
+         *
+         * 最低基础库版本:[`2.7.1`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html)
+         **/
+        getPageId(): string
+        /**
+         * 执行关键帧动画,详见[动画](https://developers.weixin.qq.com/miniprogram/dev/framework/view/animation.html)
+         *
+         * 最低基础库版本:[`2.9.0`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html)
+         **/
+        animate(
+            selector: string,
+            keyFrames: KeyFrame[],
+            duration: number,
+            callback?: () => void
+        ): void
+        /**
+         * 执行关键帧动画,详见[动画](https://developers.weixin.qq.com/miniprogram/dev/framework/view/animation.html)
+         *
+         * 最低基础库版本:[`2.9.0`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html)
+         **/
+        animate(
+            selector: string,
+            keyFrames: ScrollTimelineKeyframe[],
+            duration: number,
+            scrollTimeline: ScrollTimelineOption
+        ): void
+        /**
+         * 清除关键帧动画,详见[动画](https://developers.weixin.qq.com/miniprogram/dev/framework/view/animation.html)
+         *
+         * 最低基础库版本:[`2.9.0`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html)
+         **/
+        clearAnimation(selector: string, callback: () => void): void
+        /**
+         * 清除关键帧动画,详见[动画](https://developers.weixin.qq.com/miniprogram/dev/framework/view/animation.html)
+         *
+         * 最低基础库版本:[`2.9.0`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html)
+         **/
+        clearAnimation(
+            selector: string,
+            options?: ClearAnimationOptions,
+            callback?: () => void
+        ): void
+        /**
+         * 当从另一页面跳转到该页面时,获得与来源页面实例通信当事件通道,详见 [wx.navigateTo]((wx.navigateTo))
+         *
+         * 最低基础库版本:[`2.7.3`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html)
+         */
+        getOpenerEventChannel(): EventChannel
+        /**
+         * 获取更新性能统计信息,详见 [获取更新性能统计信息]((custom-component/update-perf-stat))
+         *
+         *
+         * 最低基础库版本:[`2.12.0`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html)
+         */
+        setUpdatePerformanceListener<WithDataPath extends boolean = false>(
+            options: SetUpdatePerformanceListenerOption<WithDataPath>,
+            callback?: UpdatePerformanceListener<WithDataPath>
+        ): void
+    }
+
+    interface ComponentOptions {
+        /**
+         * [启用多slot支持](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/wxml-wxss.html#组件wxml的slot)
+         */
+        multipleSlots?: boolean
+        /**
+         * [组件样式隔离](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/wxml-wxss.html#组件样式隔离)
+         */
+        addGlobalClass?: boolean
+        /**
+         * [组件样式隔离](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/wxml-wxss.html#组件样式隔离)
+         */
+        styleIsolation?:
+            | 'isolated'
+            | 'apply-shared'
+            | 'shared'
+            | 'page-isolated'
+            | 'page-apply-shared'
+            | 'page-shared'
+        /**
+         * [纯数据字段](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/pure-data.html) 是一些不用于界面渲染的 data 字段,可以用于提升页面更新性能。从小程序基础库版本 2.8.2 开始支持。
+         */
+        pureDataPattern?: RegExp
+        /**
+         * [虚拟化组件节点](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/wxml-wxss.html#%E8%99%9A%E6%8B%9F%E5%8C%96%E7%BB%84%E4%BB%B6%E8%8A%82%E7%82%B9) 使自定义组件内部的第一层节点由自定义组件本身完全决定。从小程序基础库版本 [`2.11.2`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) 开始支持 */
+        virtualHost?: boolean
+    }
+
+    interface TriggerEventOption {
+        /** 事件是否冒泡
+         *
+         * 默认值: `false`
+         */
+        bubbles?: boolean
+        /** 事件是否可以穿越组件边界,为false时,事件将只能在引用组件的节点树上触发,不进入其他任何组件内部
+         *
+         * 默认值: `false`
+         */
+        composed?: boolean
+        /** 事件是否拥有捕获阶段
+         *
+         * 默认值: `false`
+         */
+        capturePhase?: boolean
+    }
+
+    interface RelationOption {
+        /** 目标组件的相对关系 */
+        type: 'parent' | 'child' | 'ancestor' | 'descendant'
+        /** 关系生命周期函数,当关系被建立在页面节点树中时触发,触发时机在组件attached生命周期之后 */
+        linked?(target: TrivialInstance): void
+        /** 关系生命周期函数,当关系在页面节点树中发生改变时触发,触发时机在组件moved生命周期之后 */
+        linkChanged?(target: TrivialInstance): void
+        /** 关系生命周期函数,当关系脱离页面节点树时触发,触发时机在组件detached生命周期之后 */
+        unlinked?(target: TrivialInstance): void
+        /** 如果这一项被设置,则它表示关联的目标节点所应具有的behavior,所有拥有这一behavior的组件节点都会被关联 */
+        target?: string
+    }
+
+    interface PageLifetimes {
+        /** 页面生命周期回调—监听页面显示
+         *
+         * 页面显示/切入前台时触发。
+         */
+        show(): void
+        /** 页面生命周期回调—监听页面隐藏
+         *
+         * 页面隐藏/切入后台时触发。 如 `navigateTo` 或底部 `tab` 切换到其他页面,小程序切入后台等。
+         */
+        hide(): void
+        /** 页面生命周期回调—监听页面尺寸变化
+         *
+         * 所在页面尺寸变化时执行
+         */
+        resize(size: Page.IResizeOption): void
+    }
+
+    type DefinitionFilter = <T extends TrivialOption>(
+        /** 使用该 behavior 的 component/behavior 的定义对象 */
+        defFields: T,
+        /** 该 behavior 所使用的 behavior 的 definitionFilter 函数列表 */
+        definitionFilterArr?: DefinitionFilter[]
+    ) => void
+
+    interface Lifetimes {
+        /** 组件生命周期声明对象,组件的生命周期:`created`、`attached`、`ready`、`moved`、`detached` 将收归到 `lifetimes` 字段内进行声明,原有声明方式仍旧有效,如同时存在两种声明方式,则 `lifetimes` 字段内声明方式优先级最高
+         *
+         * 最低基础库: `2.2.3` */
+        lifetimes: Partial<{
+            /**
+             * 在组件实例刚刚被创建时执行,注意此时不能调用 `setData`
+             *
+             * 最低基础库版本:[`1.6.3`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html)
+             */
+            created(): void
+            /**
+             * 在组件实例进入页面节点树时执行
+             *
+             * 最低基础库版本:[`1.6.3`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html)
+             */
+            attached(): void
+            /**
+             * 在组件在视图层布局完成后执行
+             *
+             * 最低基础库版本:[`1.6.3`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html)
+             */
+            ready(): void
+            /**
+             * 在组件实例被移动到节点树另一个位置时执行
+             *
+             * 最低基础库版本:[`1.6.3`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html)
+             */
+            moved(): void
+            /**
+             * 在组件实例被从页面节点树移除时执行
+             *
+             * 最低基础库版本:[`1.6.3`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html)
+             */
+            detached(): void
+            /**
+             * 每当组件方法抛出错误时执行
+             *
+             * 最低基础库版本:[`2.4.1`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html)
+             */
+            error(err: Error): void
+        }>
+        /**
+         * @deprecated 旧式的定义方式,基础库 `2.2.3` 起请在 lifetimes 中定义
+         *
+         * 在组件实例刚刚被创建时执行
+         *
+         * 最低基础库版本:[`1.6.3`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html)
+         */
+        created(): void
+        /**
+         * @deprecated 旧式的定义方式,基础库 `2.2.3` 起请在 lifetimes 中定义
+         *
+         * 在组件实例进入页面节点树时执行
+         *
+         * 最低基础库版本:[`1.6.3`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html)
+         */
+        attached(): void
+        /**
+         * @deprecated 旧式的定义方式,基础库 `2.2.3` 起请在 lifetimes 中定义
+         *
+         * 在组件在视图层布局完成后执行
+         *
+         * 最低基础库版本:[`1.6.3`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html)
+         */
+        ready(): void
+        /**
+         * @deprecated 旧式的定义方式,基础库 `2.2.3` 起请在 lifetimes 中定义
+         *
+         * 在组件实例被移动到节点树另一个位置时执行
+         *
+         * 最低基础库版本:[`1.6.3`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html)
+         */
+        moved(): void
+        /**
+         * @deprecated 旧式的定义方式,基础库 `2.2.3` 起请在 lifetimes 中定义
+         *
+         * 在组件实例被从页面节点树移除时执行
+         *
+         * 最低基础库版本:[`1.6.3`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html)
+         */
+        detached(): void
+        /**
+         * @deprecated 旧式的定义方式,基础库 `2.2.3` 起请在 lifetimes 中定义
+         *
+         * 每当组件方法抛出错误时执行
+         *
+         * 最低基础库版本:[`2.4.1`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html)
+         */
+        error(err: Error): void
+    }
+
+    interface OtherOption {
+        /** 类似于mixins和traits的组件间代码复用机制,参见 [behaviors](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/behaviors.html) */
+        behaviors: Behavior.BehaviorIdentifier[]
+        /**
+         * 组件数据字段监听器,用于监听 properties 和 data 的变化,参见 [数据监听器](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/observer.html)
+         *
+         * 最低基础库版本:[`2.6.1`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html)
+         */
+        observers: Record<string, (...args: any[]) => any>
+        /** 组件间关系定义,参见 [组件间关系](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/lifetimes.html) */
+        relations: {
+            [componentName: string]: RelationOption
+        }
+        /** 组件接受的外部样式类,参见 [外部样式类](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/wxml-wxss.html) */
+        externalClasses?: string[]
+        /** 组件所在页面的生命周期声明对象,参见 [组件生命周期](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/lifetimes.html)
+         *
+         * 最低基础库版本: [`2.2.3`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) */
+        pageLifetimes?: Partial<PageLifetimes>
+        /** 一些选项(文档中介绍相关特性时会涉及具体的选项设置,这里暂不列举) */
+        options: ComponentOptions
+
+        /** 定义段过滤器,用于自定义组件扩展,参见 [自定义组件扩展](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/extend.html)
+         *
+         * 最低基础库版本: [`2.2.3`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) */
+        definitionFilter?: DefinitionFilter
+        /**
+         * 组件自定义导出,当使用 `behavior: wx://component-export` 时,这个定义段可以用于指定组件被 selectComponent 调用时的返回值,参见 [组件间通信与事件](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html)
+         * 最低基础库版本: [`2.2.3`](https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html) */
+        export: () => IAnyObject
+    }
+
+    interface KeyFrame {
+        /** 关键帧的偏移,范围[0-1] */
+        offset?: number
+        /** 动画缓动函数 */
+        ease?: string
+        /** 基点位置,即 CSS transform-origin */
+        transformOrigin?: string
+        /** 背景颜色,即 CSS background-color */
+        backgroundColor?: string
+        /** 底边位置,即 CSS bottom */
+        bottom?: number | string
+        /** 高度,即 CSS height */
+        height?: number | string
+        /** 左边位置,即 CSS left */
+        left?: number | string
+        /** 宽度,即 CSS width */
+        width?: number | string
+        /** 不透明度,即 CSS opacity */
+        opacity?: number | string
+        /** 右边位置,即 CSS right */
+        right?: number | string
+        /** 顶边位置,即 CSS top */
+        top?: number | string
+        /** 变换矩阵,即 CSS transform matrix */
+        matrix?: number[]
+        /** 三维变换矩阵,即 CSS transform matrix3d */
+        matrix3d?: number[]
+        /** 旋转,即 CSS transform rotate */
+        rotate?: number
+        /** 三维旋转,即 CSS transform rotate3d */
+        rotate3d?: number[]
+        /** X 方向旋转,即 CSS transform rotateX */
+        rotateX?: number
+        /** Y 方向旋转,即 CSS transform rotateY */
+        rotateY?: number
+        /** Z 方向旋转,即 CSS transform rotateZ */
+        rotateZ?: number
+        /** 缩放,即 CSS transform scale */
+        scale?: number[]
+        /** 三维缩放,即 CSS transform scale3d */
+        scale3d?: number[]
+        /** X 方向缩放,即 CSS transform scaleX */
+        scaleX?: number
+        /** Y 方向缩放,即 CSS transform scaleY */
+        scaleY?: number
+        /** Z 方向缩放,即 CSS transform scaleZ */
+        scaleZ?: number
+        /** 倾斜,即 CSS transform skew */
+        skew?: number[]
+        /** X 方向倾斜,即 CSS transform skewX */
+        skewX?: number
+        /** Y 方向倾斜,即 CSS transform skewY */
+        skewY?: number
+        /** 位移,即 CSS transform translate */
+        translate?: Array<number | string>
+        /** 三维位移,即 CSS transform translate3d */
+        translate3d?: Array<number | string>
+        /** X 方向位移,即 CSS transform translateX */
+        translateX?: number | string
+        /** Y 方向位移,即 CSS transform translateY */
+        translateY?: number | string
+        /** Z 方向位移,即 CSS transform translateZ */
+        translateZ?: number | string
+    }
+    interface ClearAnimationOptions {
+        /** 基点位置,即 CSS transform-origin */
+        transformOrigin?: boolean
+        /** 背景颜色,即 CSS background-color */
+        backgroundColor?: boolean
+        /** 底边位置,即 CSS bottom */
+        bottom?: boolean
+        /** 高度,即 CSS height */
+        height?: boolean
+        /** 左边位置,即 CSS left */
+        left?: boolean
+        /** 宽度,即 CSS width */
+        width?: boolean
+        /** 不透明度,即 CSS opacity */
+        opacity?: boolean
+        /** 右边位置,即 CSS right */
+        right?: boolean
+        /** 顶边位置,即 CSS top */
+        top?: boolean
+        /** 变换矩阵,即 CSS transform matrix */
+        matrix?: boolean
+        /** 三维变换矩阵,即 CSS transform matrix3d */
+        matrix3d?: boolean
+        /** 旋转,即 CSS transform rotate */
+        rotate?: boolean
+        /** 三维旋转,即 CSS transform rotate3d */
+        rotate3d?: boolean
+        /** X 方向旋转,即 CSS transform rotateX */
+        rotateX?: boolean
+        /** Y 方向旋转,即 CSS transform rotateY */
+        rotateY?: boolean
+        /** Z 方向旋转,即 CSS transform rotateZ */
+        rotateZ?: boolean
+        /** 缩放,即 CSS transform scale */
+        scale?: boolean
+        /** 三维缩放,即 CSS transform scale3d */
+        scale3d?: boolean
+        /** X 方向缩放,即 CSS transform scaleX */
+        scaleX?: boolean
+        /** Y 方向缩放,即 CSS transform scaleY */
+        scaleY?: boolean
+        /** Z 方向缩放,即 CSS transform scaleZ */
+        scaleZ?: boolean
+        /** 倾斜,即 CSS transform skew */
+        skew?: boolean
+        /** X 方向倾斜,即 CSS transform skewX */
+        skewX?: boolean
+        /** Y 方向倾斜,即 CSS transform skewY */
+        skewY?: boolean
+        /** 位移,即 CSS transform translate */
+        translate?: boolean
+        /** 三维位移,即 CSS transform translate3d */
+        translate3d?: boolean
+        /** X 方向位移,即 CSS transform translateX */
+        translateX?: boolean
+        /** Y 方向位移,即 CSS transform translateY */
+        translateY?: boolean
+        /** Z 方向位移,即 CSS transform translateZ */
+        translateZ?: boolean
+    }
+    interface ScrollTimelineKeyframe {
+        composite?: 'replace' | 'add' | 'accumulate' | 'auto'
+        easing?: string
+        offset?: number | null
+        [property: string]: string | number | null | undefined
+    }
+    interface ScrollTimelineOption {
+        /** 指定滚动元素的选择器(只支持 scroll-view),该元素滚动时会驱动动画的进度 */
+        scrollSource: string
+        /** 指定滚动的方向。有效值为 horizontal 或 vertical */
+        orientation?: string
+        /** 指定开始驱动动画进度的滚动偏移量,单位 px */
+        startScrollOffset: number
+        /** 指定停止驱动动画进度的滚动偏移量,单位 px */
+        endScrollOffset: number
+        /** 起始和结束的滚动范围映射的时间长度,该时间可用于与关键帧动画里的时间 (duration) 相匹配,单位 ms */
+        timeRange: number
+    }
+
+    interface SetUpdatePerformanceListenerOption<WithDataPath> {
+        /** 是否返回变更的 data 字段信息 */
+        withDataPaths?: WithDataPath
+    }
+    interface UpdatePerformanceListener<WithDataPath> {
+        (res: UpdatePerformance<WithDataPath>): void
+    }
+    interface UpdatePerformance<WithDataPath> {
+        /** 此次更新过程的 ID */
+        updateProcessId: number
+        /** 对于子更新,返回它所属的更新过程 ID */
+        parentUpdateProcessId?: number
+        /** 是否是被合并更新,如果是,则 updateProcessId 表示被合并到的更新过程 ID */
+        isMergedUpdate: boolean
+        /** 此次更新的 data 字段信息,只有 withDataPaths 设为 true 时才会返回 */
+        dataPaths: WithDataPath extends true ? string[] : undefined
+        /** 此次更新进入等待队列时的时间戳 */
+        pendingStartTimestamp: number
+        /** 更新运算开始时的时间戳 */
+        updateStartTimestamp: number
+        /** 更新运算结束时的时间戳 */
+        updateEndTimestamp: number
+    }
+}
+/** Component构造器可用于定义组件,调用Component构造器时可以指定组件的属性、数据、方法等。
+ *
+ * * 使用 `this.data` 可以获取内部数据和属性值,但不要直接修改它们,应使用 `setData` 修改。
+ * * 生命周期函数无法在组件方法中通过 `this` 访问到。
+ * * 属性名应避免以 data 开头,即不要命名成 `dataXyz` 这样的形式,因为在 WXML 中, `data-xyz=""` 会被作为节点 dataset 来处理,而不是组件属性。
+ * * 在一个组件的定义和使用时,组件的属性名和 data 字段相互间都不能冲突(尽管它们位于不同的定义段中)。
+ * * 从基础库 `2.0.9` 开始,对象类型的属性和 data 字段中可以包含函数类型的子字段,即可以通过对象类型的属性字段来传递函数。低于这一版本的基础库不支持这一特性。
+ * * `bug` : 对于 type 为 Object 或 Array 的属性,如果通过该组件自身的 `this.setData` 来改变属性值的一个子字段,则依旧会触发属性 observer ,且 observer 接收到的 `newVal` 是变化的那个子字段的值, `oldVal` 为空, `changedPath` 包含子字段的字段名相关信息。
+ */
+declare let Component: WechatMiniprogram.Component.Constructor

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1436 - 0
typings/types/wx/lib.wx.event.d.ts


+ 263 - 0
typings/types/wx/lib.wx.page.d.ts

@@ -0,0 +1,263 @@
+/*! *****************************************************************************
+Copyright (c) 2022 Tencent, Inc. All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+***************************************************************************** */
+
+declare namespace WechatMiniprogram.Page {
+    type Instance<
+        TData extends DataOption,
+        TCustom extends CustomOption
+    > = OptionalInterface<ILifetime> &
+        InstanceProperties &
+        InstanceMethods<TData> &
+        Data<TData> &
+        TCustom
+    type Options<
+        TData extends DataOption,
+        TCustom extends CustomOption
+    > = (TCustom &
+        Partial<Data<TData>> &
+        Partial<ILifetime> & {
+            options?: Component.ComponentOptions
+        }) &
+        ThisType<Instance<TData, TCustom>>
+    type TrivialInstance = Instance<IAnyObject, IAnyObject>
+    interface Constructor {
+        <TData extends DataOption, TCustom extends CustomOption>(
+            options: Options<TData, TCustom>
+        ): void
+    }
+    interface ILifetime {
+        /** 生命周期回调—监听页面加载
+         *
+         * 页面加载时触发。一个页面只会调用一次,可以在 onLoad 的参数中获取打开当前页面路径中的参数。
+         */
+        onLoad(
+            /** 打开当前页面路径中的参数 */
+            query: Record<string, string | undefined>
+        ): void | Promise<void>
+        /** 生命周期回调—监听页面显示
+         *
+         * 页面显示/切入前台时触发。
+         */
+        onShow(): void | Promise<void>
+        /** 生命周期回调—监听页面初次渲染完成
+     *
+     * 页面初次渲染完成时触发。一个页面只会调用一次,代表页面已经准备妥当,可以和视图层进行交互。
+     *
+
+    * 注意:对界面内容进行设置的 API 如`wx.setNavigationBarTitle`,请在`onReady`之后进行。
+    */
+        onReady(): void | Promise<void>
+        /** 生命周期回调—监听页面隐藏
+         *
+         * 页面隐藏/切入后台时触发。 如 `navigateTo` 或底部 `tab` 切换到其他页面,小程序切入后台等。
+         */
+        onHide(): void | Promise<void>
+        /** 生命周期回调—监听页面卸载
+         *
+         * 页面卸载时触发。如`redirectTo`或`navigateBack`到其他页面时。
+         */
+        onUnload(): void | Promise<void>
+        /** 监听用户下拉动作
+         *
+         * 监听用户下拉刷新事件。
+         * - 需要在`app.json`的`window`选项中或页面配置中开启`enablePullDownRefresh`。
+         * - 可以通过`wx.startPullDownRefresh`触发下拉刷新,调用后触发下拉刷新动画,效果与用户手动下拉刷新一致。
+         * - 当处理完数据刷新后,`wx.stopPullDownRefresh`可以停止当前页面的下拉刷新。
+         */
+        onPullDownRefresh(): void | Promise<void>
+        /** 页面上拉触底事件的处理函数
+         *
+         * 监听用户上拉触底事件。
+         * - 可以在`app.json`的`window`选项中或页面配置中设置触发距离`onReachBottomDistance`。
+         * - 在触发距离内滑动期间,本事件只会被触发一次。
+         */
+        onReachBottom(): void | Promise<void>
+        /** 用户点击右上角转发
+         *
+         * 监听用户点击页面内转发按钮(`<button>` 组件 `open-type="share"`)或右上角菜单“转发”按钮的行为,并自定义转发内容。
+         *
+         * **注意:只有定义了此事件处理函数,右上角菜单才会显示“转发”按钮**
+         *
+         * 此事件需要 return 一个 Object,用于自定义转发内容
+         */
+        onShareAppMessage(
+            /** 分享发起来源参数 */
+            options: IShareAppMessageOption
+        ): ICustomShareContent | void
+        /**
+         * 监听右上角菜单“分享到朋友圈”按钮的行为,并自定义分享内容
+         *
+         * 本接口为 Beta 版本,暂只在 Android 平台支持,详见 [分享到朋友圈 (Beta)](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/share-timeline.html)
+         *
+         * 基础库 2.11.3 开始支持,低版本需做兼容处理。
+         */
+        onShareTimeline(): ICustomTimelineContent | void
+
+        /** 页面滚动触发事件的处理函数
+         *
+         * 监听用户滑动页面事件。
+         */
+        onPageScroll(
+            /** 页面滚动参数 */
+            options: IPageScrollOption
+        ): void | Promise<void>
+
+        /** 当前是 tab 页时,点击 tab 时触发,最低基础库: `1.9.0` */
+        onTabItemTap(
+            /** tab 点击参数 */
+            options: ITabItemTapOption
+        ): void | Promise<void>
+
+        /** 窗口尺寸改变时触发,最低基础库:`2.4.0` */
+        onResize(
+            /** 窗口尺寸参数 */
+            options: IResizeOption
+        ): void | Promise<void>
+
+        /**
+         * 监听用户点击右上角菜单“收藏”按钮的行为,并自定义收藏内容。
+         * 基础库 2.10.3,安卓 7.0.15 版本起支持,iOS 暂不支持
+         */
+        onAddToFavorites(options: IAddToFavoritesOption): IAddToFavoritesContent
+    }
+    interface InstanceProperties {
+        /** 页面的文件路径 */
+        is: string
+
+        /** 到当前页面的路径 */
+        route: string
+
+        /** 打开当前页面路径中的参数 */
+        options: Record<string, string | undefined>
+    }
+
+    type DataOption = Record<string, any>
+    type CustomOption = Record<string, any>
+
+    type InstanceMethods<D extends DataOption> = Component.InstanceMethods<D>
+
+    interface Data<D extends DataOption> {
+        /** 页面的初始数据
+         *
+         * `data` 是页面第一次渲染使用的**初始数据**。
+         *
+         * 页面加载时,`data` 将会以`JSON`字符串的形式由逻辑层传至渲染层,因此`data`中的数据必须是可以转成`JSON`的类型:字符串,数字,布尔值,对象,数组。
+         *
+         * 渲染层可以通过 `WXML` 对数据进行绑定。
+         */
+        data: D
+    }
+
+    interface ICustomShareContent {
+        /** 转发标题。默认值:当前小程序名称 */
+        title?: string
+        /** 转发路径,必须是以 / 开头的完整路径。默认值:当前页面 path */
+        path?: string
+        /** 自定义图片路径,可以是本地文件路径、代码包文件路径或者网络图片路径。支持PNG及JPG。显示图片长宽比是 5:4,最低基础库: `1.5.0`。默认值:使用默认截图 */
+        imageUrl?: string
+    }
+
+    interface ICustomTimelineContent {
+        /** 自定义标题,即朋友圈列表页上显示的标题。默认值:当前小程序名称 */
+        title?: string
+        /** 自定义页面路径中携带的参数,如 `path?a=1&b=2` 的 “?” 后面部分 默认值:当前页面路径携带的参数 */
+        query?: string
+        /** 自定义图片路径,可以是本地文件路径、代码包文件路径或者网络图片路径。支持 PNG 及 JPG。显示图片长宽比是 1:1。默认值:默认使用小程序 Logo*/
+        imageUrl?: string
+    }
+
+    interface IPageScrollOption {
+        /** 页面在垂直方向已滚动的距离(单位px) */
+        scrollTop: number
+    }
+
+    interface IShareAppMessageOption {
+        /** 转发事件来源。
+         *
+         * 可选值:
+         * - `button`:页面内转发按钮;
+         * - `menu`:右上角转发菜单。
+         *
+         * 最低基础库: `1.2.4`
+         */
+        from: 'button' | 'menu'
+        /** 如果 `from` 值是 `button`,则 `target` 是触发这次转发事件的 `button`,否则为 `undefined`
+         *
+         * 最低基础库: `1.2.4` */
+        target: any
+        /** 页面中包含`<web-view>`组件时,返回当前`<web-view>`的url
+         *
+         * 最低基础库: `1.6.4`
+         */
+        webViewUrl?: string
+    }
+
+    interface ITabItemTapOption {
+        /** 被点击tabItem的序号,从0开始,最低基础库: `1.9.0` */
+        index: string
+        /** 被点击tabItem的页面路径,最低基础库: `1.9.0` */
+        pagePath: string
+        /** 被点击tabItem的按钮文字,最低基础库: `1.9.0` */
+        text: string
+    }
+
+    interface IResizeOption {
+        size: {
+            /** 变化后的窗口宽度,单位 px */
+            windowWidth: number
+            /** 变化后的窗口高度,单位 px */
+            windowHeight: number
+        }
+    }
+
+    interface IAddToFavoritesOption {
+        /** 页面中包含web-view组件时,返回当前web-view的url */
+        webviewUrl?: string
+    }
+
+    interface IAddToFavoritesContent {
+        /** 自定义标题,默认值:页面标题或账号名称 */
+        title?: string
+        /** 自定义图片,显示图片长宽比为 1:1,默认值:页面截图 */
+        imageUrl?: string
+        /** 自定义query字段,默认值:当前页面的query */
+        query?: string
+    }
+
+    interface GetCurrentPages {
+        (): Array<Instance<IAnyObject, IAnyObject>>
+    }
+}
+
+/**
+ * 注册小程序中的一个页面。接受一个 `Object` 类型参数,其指定页面的初始数据、生命周期回调、事件处理函数等。
+ */
+declare let Page: WechatMiniprogram.Page.Constructor
+/**
+ * 获取当前页面栈。数组中第一个元素为首页,最后一个元素为当前页面。
+
+ *  __注意:__
+
+ *  - __不要尝试修改页面栈,会导致路由以及页面状态错误。__
+ *  - 不要在 `App.onLaunch` 的时候调用 `getCurrentPages()`,此时 `page` 还没有生成。
+ */
+declare let getCurrentPages: WechatMiniprogram.Page.GetCurrentPages