typeScript开发常见问题解决办法(持续更新)

543 阅读1分钟

定义为object,无法添加新属性报错问题

  • ts中,obj[ke]报错解决在类型 "{}" 上找不到具有类型为 "string" 的参数的索引签名
interface ObjMap {
	[key: string]: string | undefined
}
getStrUrl(objData: ObjMap) {
    let str = ""
    for (let key in objData) {
            str = `${str}${key}=${objData[key]}&`
    }
    str = str.substring(0, str.length - 1);
    return str
}

data中定义变量值的类型,但接口返回值已定义格式,报错问题

  • 小程序中如果返回数据已经定义过格式,但是页面中没有,则需要断言页面的参数,断言如下:
data: {
    villageList: [] as Village[]
}
interface List {
    name: string
  }
  let data = {
    list: [] as Array<List>
  }
  data.list.push({
    name: 'Lucy'
  })

错误如下:不能将类型“Village[]”分配给类型“never[]”

image.png

想在全局的this加一个参数

  • 方法一: 使用 as 断言 this为any
computed:{
  codeMsg(){
    //这里this类型为CreateComponentPublicInstance,所以没有属性code
    return (this as any).code==200 ? 'ok' : 'err';
  }
}
  • 方法二: 使用定义新的类型赋给this
// 定义类型
interface DataType {
  date:string,
  author : string,
  code : number,
}

computed:{
    // 定义this的类型
    codeMsg(this:DataType|){
      return this.code==200 ? 'ok' : 'err';
    }
  }

TS引入js文件

  • 报错提示:“无法写入文件XXX,因为它会覆盖输入文件”
  • 解决方案,如下:
    • 1.(推荐)那就直接 const xx:any = require('package') 当js来写,弹警告就屏蔽警告;
    • 2.或者自己写声明文件xxx.d.ts(仅限目标模块是自己写的情况,xxx必须和目标文件同名)
    • 3.没有types不能import, 也就是ts不能用import引入js模块;

promise 简单命名方式

  • 报错内容:类型“void”上不存在属性“then”。 getCropperImage(opt?: object): Promise<any>