Skip to content

TypeScript 支持 ​

qinjs 支持使用 ts 开发,可参考 Vue.js TypeScript 支持 说明。

类型定义文件由 @fe6/qinjs-types 模块提供,安装后请注意配置 tsconfig.json 文件中的 compilerOptions > types 部分,如需其他小程序平台类型定义也可以安装,如:miniprogram-api-typings、mini-types。对于缺少或者错误的类型定义,可以自行在本地新增或修改并同时报告给官方请求更新。

开发方式 ​

需要在创建项目时就指定 ts ,具体请另行参考文档TODO

修改 Typescript 配置 ​

在根目录创建 tsconfig.json 文件,并进行个性化配置,推荐配置如下:

json
// tsconfig.json
{
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    "strict": true,
    "jsx": "preserve",
    "moduleResolution": "node",
    "esModuleInterop": true,
    "sourceMap": true,
    "skipLibCheck": true,
    "importHelpers": true,
    "allowSyntheticDefaultImports": true,
    "useDefineForClassFields": true,
    "resolveJsonModule": true,
    "lib": [
      "esnext",
      "dom"
    ],
    "types": [
      "@fe6/qinjs-types"
    ]
  },
  "exclude": [
    "node_modules",
    "unpackage"
  ]
}
// tsconfig.json
{
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    "strict": true,
    "jsx": "preserve",
    "moduleResolution": "node",
    "esModuleInterop": true,
    "sourceMap": true,
    "skipLibCheck": true,
    "importHelpers": true,
    "allowSyntheticDefaultImports": true,
    "useDefineForClassFields": true,
    "resolveJsonModule": true,
    "lib": [
      "esnext",
      "dom"
    ],
    "types": [
      "@fe6/qinjs-types"
    ]
  },
  "exclude": [
    "node_modules",
    "unpackage"
  ]
}

个性化配置是可选的,没有tsconfig.json时会自动使用默认配置运行。

TypeScript 支持兼容性说明 ​

  • qinjs 的 vue 文件支持最新版 ts 。

ts组件 ​

声明 lang="ts" 后,该 vue 文件 import 进来的所有 vue 组件,均需要使用 ts 编写。

示例代码

改造 qin-badge.vue

vue
<script lang="ts">
    // 仅展示需要修改的核心代码,完整代码请参考原来的组件。
  import Vue from 'vue';
  export default Vue.extend({
    props: {
      type: {
        type: String,
        default: 'default'
      },
      inverted: {
        type: Boolean,
        default: false
      },
      text: {
        type: [String, Number],
        default: ''
      },
      size: {
        type: String,
        default: 'normal'
      }
    },
    computed: {
      setClass(): string {
        const classList: string[] = ['qin-badge-' + this.type, 'qin-badge-size-' + this.size];
        if (this.inverted === true) {
          classList.push('qin-badge-inverted')
        }
        return classList.join(" ")
      }
    },
    methods: {
      onClick() {
        this.$emit('click')
      }
    }
  })
</script>
<script lang="ts">
    // 仅展示需要修改的核心代码,完整代码请参考原来的组件。
  import Vue from 'vue';
  export default Vue.extend({
    props: {
      type: {
        type: String,
        default: 'default'
      },
      inverted: {
        type: Boolean,
        default: false
      },
      text: {
        type: [String, Number],
        default: ''
      },
      size: {
        type: String,
        default: 'normal'
      }
    },
    computed: {
      setClass(): string {
        const classList: string[] = ['qin-badge-' + this.type, 'qin-badge-size-' + this.size];
        if (this.inverted === true) {
          classList.push('qin-badge-inverted')
        }
        return classList.join(" ")
      }
    },
    methods: {
      onClick() {
        this.$emit('click')
      }
    }
  })
</script>

在 index.vue 中引用 qin-badge 组件

ts
<script lang="ts">
  import Vue from 'vue';
  import qinBadge from '../../components/qin-badge.vue';
  export default Vue.extend({
    data() {
      return {
        title: 'Hello'
      }
    },
    components:{
      qinBadge
    }
  });
</script>
<script lang="ts">
  import Vue from 'vue';
  import qinBadge from '../../components/qin-badge.vue';
  export default Vue.extend({
    data() {
      return {
        title: 'Hello'
      }
    },
    components:{
      qinBadge
    }
  });
</script>