TS如何处理class中无初始值属性的类型?

如下:
b是chart的一个实例对象,无法设置初始值,页无法在constructor中初始化。这样就会报错:

class Test {
  private a: string
  // 属性“b”没有初始化表达式,且未在构造函数中明确赋值。
  private b: ChartCfg 
  constructor(a: string) {
    this.a = a
  }
  createB() {
    this.b = new Chart({ 
        container: '#chart'
        // ...
    })
  }
  testB() {
    this.b.line()
  } 
}

如果给b一个初始值,类型就不匹配

// 不能将类型“null”分配给类型“Chart”。
private b: Chart = null

如果给b加个类型,调用它的时候类型就会报错😂

private b: Chart | null = null
// 对象可能为 "null"。
this.b.line()

我可以用断言,但是每次使用b都需要断言,太麻烦了😥

(<Chart>this.b).line()

大神们如果解决这类问题?

阅读 16.8k
6 个回答

非空断言就行了。

this.b!.line();

private b: Chart = new Chart({ container: '#chart' })

private b?: ChartCfg 
 
createB() {
    this.b = new Chart({ 
        container: '#chart'
        // ...
    })
}

testB() {
    this.b?.line()
} 

每次加"!"断言其实也挺麻烦的,何不加个忽略注释 ]ۣۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖ]ۖۖۖۖۖۖۖۖۖۖۖۖ


class Test {
  // @ts-ignore
  private b: ChartCfg;
  
  testB() {
    this.b.line();
  }
}
新手上路,请多包涵


我这样写不会报错:属性“b”没有初始化表达式,且未在构造函数中明确赋值。呢

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题