前面我们提到了值类型,在我们设置值类型的时候,有一种定义方式就是联合类型的设定,如下:
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
这里需要注意的是,类型断言只是用来判断变量的数据类型,是不能用来转换变量的数据类型。