携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第31天,点击查看活动详情
前言
大家好呀,我是L同学。在上篇文章TypeScript学习笔记(六)中,我们学习了TypeScript的相关知识点,包括类型推论、字面量类型、枚举类型等相关知识点。在本篇文章中,我们将学习TypeScript的相关知识点,包括any 类型、类型断言、typeof等内容。
any 类型
原则上不推荐使用 any!这会让 TypeScript 变为 “AnyScript”(失去 TS 类型保护的优势)。因为当值的类型为 any 时,可以对该值进行任意操作,并且不会有代码提示。
let obj: any = { x: 0 }
obj.bar = 100
obj()
const n: number = obj
以上操作都不会有任何类型错误提示,即使可能存在错误。尽可能的避免使用 any 类型,除非临时使用 any 来“避免”书写很长、很复杂的类型。
其他隐式具有 any 类型的情况:
- 声明变量不提供类型也不提供默认值
- 函数参数不加类型
需要注意的是,因为不推荐使用 any,所以,这两种情况下都应该提供类型。
类型断言
有时候你会比 TS 更加明确一个值的类型,此时,可以使用类型断言来指定更具体的类型。 比如,
const aLink = document.getElementById('link')
该方法返回值的类型是 HTMLElement,该类型只包含所有标签公共的属性或方法,不包含 a 标签特有的 href 等属性。因此,这个类型太宽泛(不具体) ,无法操作 href 等 a 标签特有的属性或方法。解决方式是这种情况下就需要使用类型断言指定更加具体的类型。
使用类型断言:
const aLink = document.getElementById('link') as HTMLAnchorElement
使用 as 关键字实现类型断言。关键字 as 后面的类型是一个更加具体的类型(HTMLAnchorElement 是 HTMLElement 的子类型)。通过类型断言,aLink 的类型变得更加具体,这样就可以访问 a 标签特有的属性或方法了。
另一种语法,使用 <> 语法,这种语法形式不常用知道即可:
const aLink = <HTMLAnchorElement>document.getElementById('link')
技巧:在浏览器控制台,通过 __proto__ 获取 DOM 元素的类型
typeof
众所周知,JS 中提供了 typeof 操作符,用来在 JS 中获取数据的类型。
console.log(typeof 'Hello world')
实际上,TS 也提供了 typeof 操作符:可以在类型上下文中引用变量或属性的类型(类型查询)。使用场景是根据已有变量的值,获取该值的类型,来简化类型书写。
let p = { x: 1, y: 2 }
function formatPoint(point: { x: number; y: number }) {}
formatPoint(p)
function formatPoint(point: typeof p) {}
使用 typeof 操作符来获取变量 p 的类型,结果与第一种(对象字面量形式的类型)相同。typeof 出现在类型注解的位置(参数名称的冒号后面)所处的环境就在类型上下文(区别于 JS 代码)。需要注意的是,typeof 只能用来查询变量或属性的类型,无法查询其他形式的类型(比如,函数调用的类型)。