TypeScript 断言使用

我不是女神ヾ 2023-10-06 21:54 117阅读 0赞

阅读目录

  • Enums 枚举
  • as断言
  • const 断言
    • let & const
    • const
    • 数组赋值
    • 解构
  • null / undefined
  • 非空断言
  • DOM
    • 类型推断
    • null 处理
    • 断言处理
      • 示例

Enums 枚举

枚举在程序语言及 mysql 等数据库中广泛使用

不设置值时,值以 0 开始递增

下面是使用枚举设置性别

  1. enum SexType {
  2. BOY, GIRL
  3. }
  4. const hd = {
  5. name: 'wgchen',
  6. sex: SexType.GIRL
  7. }
  8. console.log(hd);

在这里插入图片描述

当某个字段设置数值类型的值后,后面的在它基础上递增

  1. enum SexType {
  2. BOY = 1, GIRL
  3. }
  4. const hd = {
  5. name: 'wgchen',
  6. sex: SexType.GIRL
  7. }
  8. console.log(hd);

在这里插入图片描述
可以将值设置为其他类型

  1. enum SexType {
  2. BOY = '男', GIRL = '女'
  3. }
  4. console.log(SexType);

在这里插入图片描述

as断言

as 断言的意思就是用户断定这是什么类型,不使用系统推断的类型,说白了就是『我说是什么,就是什么』

下例中TS 会根据函数推断变量 f 的类型是 string | number

  1. function hd(arg: number) {
  2. return arg ? 'wgchen' : 2030
  3. }
  4. let f = hd(1) //let f: string | number
  5. console.log(f); // wgchen

我们可以由开发者来断定(断言)这就是字符串,这就是断言

  1. function hd(arg: number) {
  2. return arg ? 'wgchen' : 2030
  3. }
  4. let f = hd(1) as string //let f: string
  5. console.log(f); // wgchen

也可以使用下面的断言语法

  1. function hd(arg: number) {
  2. return arg ? 'wgchen' : 2030
  3. }
  4. let f = <string>hd(1) //let f: string

const 断言

let & const

  • const 保证该字面量的严格类型
  • let 为通用类型比如字符串类型

    const hd = ‘wgchen’ //const hd: “houdunren”
    let xj = ‘wgchen’ //let xj: string

const

const 断言告诉编译器为表达式推断出它能推断出的最窄或最特定的类型,而不是宽泛的类型。

  • 字符串、布尔类型转换为具体值
  • 对象转换为只读属性
  • 数组转换成为只读元组

下面限定 user 类型为最窄类型 wgchen

  1. let user = '博客' as const
  2. user = 'wgchen'
  3. //与以下很相似
  4. let user: 'wgchen' = 'wgchen'
  5. user = 'wgchen'

对象转换为只读属性

  1. let user = {
  2. name: '博客' } as const
  3. user.name = 'wgchen' //因为是只读属性,所以不允许设置值

当为变量时转换为变量类型,具体值是转为值类型

  1. let a = 'wgchen'
  2. let b = 2030
  3. //readonly [string, number, "sina.com", true, 100]
  4. let f = [a, b, 'wgchen', true, 100] as const
  5. console.log(f);
  6. let hd = f[0]
  7. hd = '博客'
  8. console.log(hd); // 博客

在这里插入图片描述

数组赋值

变量 f 得到的类型是数组的类型 string|number,所以只要值是这两个类型都可以

  1. let a = 'wgchen'
  2. let b = 2039
  3. let hd = [a, b] //let hd: (string | number)[]
  4. let f = hd[1] //let f: string | number
  5. f = '博客' //不报错,因为类型是 string | number

使用 const 后会得到值的具体类型,面不是数组的类型

  1. let a = 'wgchen'
  2. let b = 2039
  3. let hd = [a, b] as const //let hd: readonly [string, number]
  4. let f = hd[1] //let f: number
  5. f = '博客' //报错,只能是最窄类型即变量 b 的类型 number

也可以使用以下语法

  1. let a = 'wgchen'
  2. let b = 2039
  3. let hd = <const>[a, b] //let hd: readonly [string, number]
  4. let f = hd[1] //let f: number
  5. f = 199

解构

下面解构得到的变量类型不是具体类型,面是数组类型,比如变量 y 的类型是 string | (() => void)

这在写项目时是不安全的,因为可以将 y 随时修改为字符串,
同时也不会有友好的代码提示:

  1. function hd() {
  2. let a = 'wgchen'
  3. let b = (x: number, y: number): number => x + y
  4. return [a, b]
  5. }
  6. let [n, m] = hd() //变量 m 的类型为 string | (() => void)
  7. m(1, 6) //报错:因为类型可能是字符串,所以不允许调用

可以断言 m 为函数然后调用

  1. function hd() {
  2. let a = 'wgchen'
  3. let b = (x: number, y: number): number => x + y
  4. return [a, b]
  5. }
  6. let [n, m] = hd()
  7. console.log((m as Function)(1, 2))
  8. //使用以下类型声明都是可以的
  9. console.log((m as (x: number, y: number) => number)(1, 5)

在这里插入图片描述

可以在调用时对返回值断言类型

  1. function hd() {
  2. let a = 'wgchen'
  3. let b = (x: number, y: number): number => x + y
  4. return [a, b]
  5. }
  6. let [n, m] = hd() as [string, (x: number, y: number) => number]
  7. console.log(m(9, 19))

在这里插入图片描述
也可以在函数体内声明返回类型

  1. function hd() {
  2. let a = 'wgchen'
  3. let b = (x: number, y: number): number => x + y
  4. return [a, b] as [typeof a, typeof b]
  5. }
  6. let [n, m] = hd()
  7. console.log(m(9, 19))

在这里插入图片描述

null / undefined

默认情况下 null 与 undefined 可以赋值给其他类型

  1. let hd: string = 'wgchen.blog'
  2. hd = null
  3. hd = undefined

当我们修改 tsconfig.json 配置文件的 strictNullChecks 字段为 true(默认即为 true) 时,则不能将 null、undefined 赋值给其他类型

  1. "strictNullChecks": true

除非向下面一样明确指定类型

  1. let hd: string |undefiend|null = 'wgchen.blog'
  2. hd = null
  3. hd = undefined

非空断言

下面的示例获取的值可能为 HTMLDivElementnull,所以直接分配类型“HTMLDivElement” 将报错误。

下例操作需要开启 tsconfig.json 的配置项 strictNullChecks 字段为 true

  1. const el: HTMLDivElement = document.querySelector('.hd')
  2. console.log(el.id);

可以使用 as 断言类型

  1. const el: HTMLDivElement = document.querySelector('.hd') as HTMLDivElement
  2. console.log(el.id);

在值后面使用 ! 来声明值非 null

  1. const el: HTMLDivElement = document.querySelector('.hd')!
  2. console.log(el.id);

DOM

为了演示示例我们创建 html 文件如下

下面的操作需要开启 tsconfig.json 的配置项 strictNullChecks 字段为 true

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <title>wgchen</title>
  5. <script src="1.js" defer></script>
  6. </head>
  7. <body>
  8. <div class="hd">https://wgchen.blog.csdn.net</div>
  9. <button id="bt">插入元素</button>
  10. </body>
  11. </html>

类型推断

对于获取的标签对象可能是为 null 也可能是该标签类型

body 等具体标签可以准确标签类型或 null
根据 class 等获取不能准确获取标签类型,推断的类型为 Element|null

  1. //const body: HTMLBodyElement|null
  2. const body = document.querySelector('body')

下面是根据 class 获取标签结果是 ELement 并不是具体的标签,因为根据 class 无法确定标签类型

  1. //const el: Element | null
  2. const el = document.querySelector('.hd')

null 处理

针对于其他标签元素,返回值可能为 null,所以使用 as 断言或!

处理

  1. //const div: HTMLDivElement
  2. let div = document.querySelector('div') as HTMLDivElement
  3. //或使用
  4. div = document.querySelector('div')! //非空断言
  5. console.log(div.id);

断言处理

使用 as 将类型声明为 HTMLAnchorElementTS 会将其按 a 链接类型处理

现在所有的提示将是 a 链接属性或方法

  1. // const el: HTMLAnchorElement
  2. const el = document.querySelector('.hd') as HTMLAnchorElement
  3. console.log(el.href);

下例中的 DOM 类型会报错,因为 .hd 是Element 类型,而构建函数参数 el 的类型是 HTMLDivElement

  1. class Hd {
  2. constructor(el: HTMLDivElement) {
  3. }
  4. }
  5. const el = document.querySelector('.hd'); //el: Element
  6. new Hd(el)

这时可以使用 as 断言处理,明确告之获取的值类型是 HTMLDivElement

  1. class Hd {
  2. constructor(el: HTMLDivElement) {
  3. }
  4. }
  5. const el = document.querySelector('.hd') as HTMLDivElement;
  6. new Hd(el)

示例

test.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <a class="hd" href="https://wgchen.blog.csdn.net">博客</a>
  9. <script src="./ts.js"></script>
  10. </body>
  11. </html>

ts.ts

  1. const el = document.querySelector('.hd') as HTMLAnchorElement;
  2. console.log(el.href);

在这里插入图片描述
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,117人围观)

还没有评论,来说两句吧...

相关阅读

    相关 typescript类型断言

    作用: 通过类型断言这种方式可以告诉编译器,“相信我,我知道自己在干什么”,你会比 TypeScript 更了解某个值的详细信息,你清楚的知道一个实体具有比它现有类型更确