我有一个关于在类中设置联合类型的简单示例。

class Foo {
  constructor() {}
  progress: number | string = 0;

  bar() {
        this.progress = this.progress + 5;
    }
}

我本以为会增加5,但却收到一个ts(2365)错误。
Operator '+' cannot be applied to types 'string | number' and '5'.ts(2365)
我认为这是可行的,因为如果我在下面这样的类之外设置它。
let progress: number | string = 0;
progress = progress + 5;

没有错误。
最后,我要做的是在一个类声明中设置一个变量,它接受来自setInterval的一个数字,所以我尝试将变量设置为UNIX和NodeJS.Timer的联合类型,因为setInterval返回NodeJS.Timer
export class CurrentTrainingComponent implements OnInit {
  interval: number | NodeJS.Timer;
  progress: number = 0;

  constructor() {}

  ngOnInit() {
    this.interval = setInterval(() => {
      this.progress = this.progress + 5;
      if (this.progress >= 100) {
        clearInterval(this.interval);
      }
    }, 100);
  }

  onStop() {
    clearInterval(this.interval);
  }
}

我知道我可以简单地分配<any>来解决这个问题,但我想看看是否可以尝试联合类型。
与此问题无关的最后一件事,设置this.interval = <any>setInterval( ()=>{} )<number>显示警告setInterval

最佳答案

在bar函数中,您不能确定您的值现在是一个数字。
您可以添加额外的支票使其生效

class Foo {
    constructor() {}
    progress: number | string = 0;

    bar() {
        if (typeof this.progress === 'number')
            this.progress = this.progress + 5;
    }
}

万一
let progress: number | string = 0;
progress = progress + 5;

值肯定是一个数字(它被指定在上面的一行)

关于typescript - 类内的Typescript联合类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56026681/

10-09 17:02