使用类型警卫检查打字稿

时间:2017-09-12 11:03:12

标签: angular typescript casting

我有一个方法,它启动一个modalWindow,它接受一个元素作为输入(使用$ event.target)或一个数字。我正在尝试检查输入的类型,但检查始终将元素视为数字,即使它不是。无论元素是否为数字,都会输出console.log,而其他内容永远不会运行。

launchModal(element: number | any) {

    if (<number>element) {

      console.log('ele as num', element);
    } else {
      const elementId = (event.target as Element).id;
      const elementIdArray = String(elementId).split('-');
      this.currentRow = parseInt(elementIdArray[2], 10);

    }
    this.loadEquipmentFullRowDataRequest(this.currentRow);

  }

我在official site

上关注高级类型的文档

2 个答案:

答案 0 :(得分:3)

在typescript中,类型系统只是编译时间,在运行时,代码被转换为JavaScript,并且所有类型信息都将丢失。

当你说if (<number>element)演员实际上没有做任何事情时,它只允许你编写代表element作为数字的代码(这里你不做任何事情)到element所以它没有意义。)

为了检查您获得的值是否真的是一个数字,您必须使用JavaScript方法:

if(typeof(element) === 'number')

答案 1 :(得分:1)

if(<number>element)没有输入检查元素是否为数字,一旦编译,它只会检查element是不是null还是undefined

尝试以下方法:

const launchModal = (elem: number | HTMLElement) => {
    if (!elem) {
        return;
    }

    let row = elem as number;
    if (elem instanceof HTMLElement) {
        row = parseInt(elem.id.split('-')[2], 10);
    }

    // load row data
}

e.g。 :

launchModal(10);

launchModal(document.getElementById('...'));