sprhawk
sprhawk
  • 发布:2019-05-12 22:07
  • 更新:2019-06-14 17:19
  • 阅读:7441

【报Bug】typescript 使用 @types/uni-app 无法正确编译

分类:uni-app

详细问题描述

(DCloud产品不会有明显的bug,所以你遇到的问题大都是在特定环境下才能重现的问题,请仔细描述你的环境和重现方式,否则DCloud很难排查解决你的问题)

[内容]
使用 vue-cli 创建基于 typescript 项目,默认使用的是 @dcloudio/types 作为类型描述,但是这个类型比较老旧,我看到 dcloud 已经提交类型文件到 DefinitelyTyped ,但是直接使用 @types/uni-app 除了几个小问题 PR #2 ,最大的问题是它不能正确的引入 Vue 的扩展定义。
在 @dcloudio/types 中的 index.d.ts 导入了各个子模块,而在 @types/uni-app 中,index.d.ts 只有 uni 定义,其他在 lib/*.d.ts 都没有被默认包含进来。

我自己对 Declaration Files 不是很熟悉,没有动手去改。我只在生成的工程文件里的 App.vue 里使用了

/// <reference path="../node_modules/@types/uni-app/lib/common.d.ts" />  
/// <reference path="../node_modules/@types/uni-app/lib/app.d.ts" />  
/// <reference path="../node_modules/@types/uni-app/lib/page.d.ts" />  
/// <reference path="../node_modules/@types/uni-app/lib/vue.d.ts" />

来解决 typescript 编译的问题

重现步骤

[步骤]
vue-cli 创建 typescript 项目模板
yarn remove \@dcloudio/types
yarn add \@types/uni-app
yarn build
[结果]

6:3 Argument of type '{ mpType: string; onLaunch(): void; onShow(): void; onHide(): void; }' is not assignable to parameter of type 'ComponentOptions<Vue, DefaultData<Vue>, DefaultMethods<Vue>, DefaultComputed, PropsDefinition<Record<string, any>>, Record<string, any>>'.  
  Object literal may only specify known properties, and 'mpType' does not exist in type 'ComponentOptions<Vue, DefaultData<Vue>, DefaultMethods<Vue>, DefaultComputed, PropsDefinition<Record<string, any>>, Record<string, any>>'.  
    4 |  
    5 | export default Vue.extend({  
  > 6 |   mpType: "app",  
      |   ^  
    7 |   onLaunch() {  
    8 |     console.log("App Launch");  
    9 |     vxm.user.getStoredAccessToken();

[期望]
编译成功

[如果语言难以表述清晰,拍一个视频或截图,有图有真相]

IDE运行环境说明

[HBuilder 或 HBuilderX。如果你用其他工具开发uni-app,也需要在此说明]
yarn -v
1.15.2
[mac版本号]
10.14.2

uni-app运行环境说明

[运行端是h5或app或某个小程序?]
微信小程序
[运行端版本号]
"@dcloudio/uni-mp-weixin@*":
version "0.0.952"
"@dcloudio/vue-cli-plugin-uni@^0.9.462":
version "0.9.462"
"@types/uni-app@^1.0.1":
version "1.0.1"
[项目是cli创建的还是HBuilderX创建的?如果是cli创建的,请更新到最新版cli再试]
cli

[可重现代码片段]
App.vue

<script lang="ts">  
/// <reference path="../node_modules/@types/uni-app/lib/common.d.ts" />  
/// <reference path="../node_modules/@types/uni-app/lib/app.d.ts" />  
/// <reference path="../node_modules/@types/uni-app/lib/page.d.ts" />  
/// <reference path="../node_modules/@types/uni-app/lib/vue.d.ts" />  

import Vue from "vue";  
import { vxm } from "./store";  

export default Vue.extend({  
  mpType: "app",  
  onLaunch() {  
    console.log("App Launch");  
    vxm.user.getStoredAccessToken();  
  },  
  onShow() {  
    console.log("App Show");  
  },  
  onHide() {  
    console.log("App Hide");  
  }  
});  
</script>  

<style>  
@import "colorui/main.css";  
@import "colorui/icon.css";  
</style>
2019-05-12 22:07 负责人:无 分享
已邀请:
DCloud_UNI_GSQ

DCloud_UNI_GSQ

感谢反馈,@dcloudio/types 并不老旧,而是一般比 @types/uni-app 新,你可以先使用 @dcloudio/types,后期修复 @types/uni-app

  • sprhawk (作者)

    我说@dcloudio/types老旧是因为 storage 的几个 api 的参数类型是错误的,而 @types/uni-app是修复的

    2019-05-16 14:20

  • DCloud_UNI_GSQ

    回复 sprhawk: 已经修复

    2019-05-16 16:24

  • sprhawk (作者)

    回复 DCloud_UNI_GSQ: 嗯,现在用新版本的 @types/uni-app已经 OK 了

    2019-06-10 22:24

  • 1***@qq.com

    如何更新@dcloudio/types

    2020-02-18 03:41

rudy_24

rudy_24

我也遇到了类似的问题,运行正常,但是在hbuilderx上面打包成app就失败,我这里是通过命令行创建的ts项目
HBuilder] 09:52:28.306 [tsl] ERROR at App.vue:4
[HBuilder] 09:52:28.307 TS2345:Argument of type '{ mpType: string; onLaunch(): void; onShow(): void; onHide(): void; }' is not assignable to parameter of type 'ComponentOptions<Vue, DefaultData<Vue>, DefaultMethods<Vue>, DefaultComputed, PropsDefinition<Record<string, any>>, Record<string, any>>'.
[HBuilder] 09:52:28.315 Object literal may only specify known properties, and 'mpType' does not exist in type 'ComponentOptions<Vue, DefaultData<Vue>, DefaultMethods<Vue>, DefaultComputed, PropsDefinition<Record<string, any>>, Record<string, any>>'.
[HBuilder] 09:52:28.321 ERROR Build failed with errors.

App.vue


<script lang="ts">  
import Vue from 'vue'  
export default Vue.extend({  
  mpType: 'app',  
  onLaunch() {  
    console.log('App Launch')  
  },  
  onShow() {  
    console.log('App Show')  
  },  
  onHide() {  
    console.log('App Hide')  
  }  
})  
</script>  
9***@qq.com

9***@qq.com

同样的问题,cli创建的(typeScript uni-app),跑起来就抛出错误。

  • rudy_24

    我的已经搞定了,你的报什么错?

    2019-06-05 13:24

  • 9***@qq.com

    回复 rudy_24: 你怎么搞定的

    2019-06-11 11:33

  • rudy_24

    回复 9***@qq.com: 使用uniapp官方命令行创建ts项目,就是Vue.extend式的,没用vue推荐的 vue-class-component装饰器

    2019-06-11 15:29

m***@idreamsky.com

m***@idreamsky.com

没有读到 @dcloudio/types 中的 Vue 声明引起的。我是在 main.ts 里面加上这一句解决问题

import ComponentOptions from '@dcloudio/types'
  • j***@foxmail.com

    我在main.ts加了这行,还是有问题,还需要额外的补充?

    2019-08-28 19:31

  • 2***@qq.com

    然后找不到dcloudio/types文件呀

    2020-07-29 15:14

该问题目前已经被锁定, 无法添加新回复