首页 > 编程笔记 > JavaScript笔记
阅读:6
TypeScript中的类型断言(附带实例)
TypeScript 通过类型断言这种方式告诉编译器“相信我,我知道自己在干什么”。
类型断言好比其他程序语言里的类型转换,但与类型转换不同的是,类型断言不进行特殊的数据检查。它在运行时不对代码产生影响,只在编译阶段起作用,因为 TypeScript 会假设程序员对代码已经进行了类型检查。
类型断言有两种语法形式,分别是“尖括号”语法和 as 语法。
假如我们想要获取一个联合类型“number|string”变量的长度。虽然 string 类型的变量有 length 属性,number 类型的变量没有 length 属性,但我们可以直接通过条件判断确认 x.length 是否可取,代码如下:
为了让 TypeScript 认识到“相信我,我知道自己在干什么”,可以尝试对变量进行类型断言。
比如“<string>x”的断言声明已经明确当变量 x 是 string 类型时,就进行条件判断,并且可以利用“(x as string)”将变量 x 进行 string 类型的强制转换,最终得到 length 属性。如果变量 x 是 number 类型,则可以直接利用 number 类型的变量拥有的 toString 方法先将其转化成字符串,再得到其 length 属性,代码如下:
类型断言好比其他程序语言里的类型转换,但与类型转换不同的是,类型断言不进行特殊的数据检查。它在运行时不对代码产生影响,只在编译阶段起作用,因为 TypeScript 会假设程序员对代码已经进行了类型检查。
类型断言有两种语法形式,分别是“尖括号”语法和 as 语法。
假如我们想要获取一个联合类型“number|string”变量的长度。虽然 string 类型的变量有 length 属性,number 类型的变量没有 length 属性,但我们可以直接通过条件判断确认 x.length 是否可取,代码如下:
/* 需求:定义一个函数得到一个string或number联合类型变量的长度 */ // 错误实现 function getLength(x: number | string) { // return x.length // error, number 类型的变量没有 length 属性 if (x.length) { // error, number 类型的变量没有 length 属性 return x.length; } else { return x.toString().length; } }
为了让 TypeScript 认识到“相信我,我知道自己在干什么”,可以尝试对变量进行类型断言。
比如“<string>x”的断言声明已经明确当变量 x 是 string 类型时,就进行条件判断,并且可以利用“(x as string)”将变量 x 进行 string 类型的强制转换,最终得到 length 属性。如果变量 x 是 number 类型,则可以直接利用 number 类型的变量拥有的 toString 方法先将其转化成字符串,再得到其 length 属性,代码如下:
// 正确实现:类型断言 function getLength(x: number | string) { if (<string>x).length) { return (x as string).length; } else { return x.toString().length; } } console.log(getLength('zhangsan'), getLength(2015));