TypeScript学习(七):类型断言

前面我们提到了值类型,在我们设置值类型的时候,有一种定义方式就是联合类型的设定,如下:

let a: number | string;
a = 1;          // 类型推论:此时变量a为number类型
a = 'string';   // 类型推论:此时变量a为string类型

或者是任意类型的设定,如下:

let a: any;
a = 1;          // 类型推论:变量a为number类型
a = 'string';   // 类型推论:变量a为string类型
a = true;       // 类型推论:变量a为boolean类型

现在我们先来模拟一种实际开发中遇到的情况:输入一个变量a,返回数据的长度。这种开发要求下,我们在JavaScript中可以利用字符串独有的length属性来区别数据类型或者是用typeof()来判断数据类型,经过判断后再来处理对应的数据,然后返回我们想要的结果,但是在typescript中,我们可以采用同样的方法吗?如下:

function getResult(a: string | number):number {
    if (a.length) {
        return a.length;
    } else {
        return a.toString().length;
    }
}

// 执行编译指令:Property 'length' does not exist on type 'number'.

在这里,我们定义函数getResult的输入参数为联合类型(字符串或者数值类型),输出类型为数值类型,不清楚函数定义的同胞们可以参考上一篇文章(函数的定义及特性)。可以看到当我们执行编译指令的时候,编译报错了,报错信息就是:length属性不存在于number类型中。我们之前提到过,访问联合属性的变量,需要访问两个类型或者其子类型共有属性才可以,所以在typescript中不能采用length的特点来进行判断区分。但是利用typeof()时没有任何问题的,如下:

function getResult(a: string | number):number {
    if (typeof(a) === 'string') {
        return a.length;
    } else {
        return a.toString().length;
    }
}

let b = getResult('hahahaha');    // 输出长度为8

但是,如果非要使用length属性呢?这里,我们介绍一种在typescript中使用的方法:类型断言,字面理解就是确定变量的数据类型。它断言的语法主要有两种:

let someValue: any = "this is a string";
// '尖括号'语法:<类型>值
let strLength: number = (<string>someValue).length;
// 'as'语法:值 as 类型
let strLength: number = (someValue as string).length;

所以,利用这种类型断言的方法,我们就可以利用length的特性来作判断,代码如下:

function getResult(a: string | number):number {
    if ((<string>a).length) {
        return (<string>a).length;    // 切记:这里也需要加上类型断言
    } else {
        return a.toString().length;
    }
}

let b = getResult('hahahaha');  // 长度为8

这里需要注意的是,类型断言只是用来判断变量的数据类型,是不能用来转换变量的数据类型。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值