Skip to content

断言

Enums 枚举

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

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

    下面是使用枚举设置性别

    typescript
    enum SexType {
        BOY, GIRL
    }
    
    const hd = {
        name: 'husky',
        sex: SexType.GIRL
    }
    console.log(hd); //{ name: 'hubsky', sex: 1 }

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

    typescript
    enum SexType {
        BOY = 1, GIRL
    }
    const hd = {
        name: 'husky',
        sex: SexType.GIRL
    }
    console.log(hd); //{ name: 'hubsky', sex: 2 }

    可以将值设置为其他类型

    typescript
    enum SexType {
        BOY = '男', GIRL = '女'
    }
    const hd = {
        name: 'husky',
        sex: SexType.GIRL
    }
    console.log(hd); //{ name: 'hubsky', sex: '女' }

as 断言

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

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

typescript
function hs(arg: number) {
  return arg ? 'hubsky' : 2030
}

let f = hs(1) //let f: string | number

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

typescript
function hd(arg: number) {
  return arg ? 'hubsky' : 2030
}

//let f: string
let f = hd(1) as string

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

typescript
function hs(arg: number) {
  return arg ? 'hubsky' : 2030
}
//let f: string
let f = <string>hs(1)

const 断言

let & const

  • const 保证该字面量的严格类型
  • let 为通用类型比如字符串类型
typescript
const hs = 'hs' //const hs: "hs"
let hsy = 'hubsky' //let hsy: string

const

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

  • 字符串、布尔类型转换为具体值("值类型")
  • 对象转换为只读属性
  • 数组转换成为只读元组
typescript
let user = 'hubsky' as const
user = 'hubsky.com'

//与以下很相似
let user: 'huskyha' = 'hubskyha'
user = 'hubskyha'

对象转换为只读属性

typescript
let user = { name: 'hsy' } as const
user.name = 'hsy' //因为是只读属性,所以不允许设置值

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

typescript
let a = 'hubsky.com'
let b = 2030

let f = [a, b, 'hsy.com', true, 100] as const //readonly [string, number, "hsy.com", true, 100]
let hs = f[0]
hs = 'jk'

数组赋值

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

typescript
let a = 'houdunren.com'
let b = 2039

let hd = [a, b] //let hd: (string | number)[]
let f = hd[1] //let f: string | number
f = '后盾人' //不报错,因为类型是 string | number

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

typescript
let a = 'houdunren.com'
let b = 2039

let hd = [a, b] as const //let hd: readonly [string, number]
let f = hd[1] //let f: number
f = '后盾人' //报错,只能是最窄类型即变量 b 的类型 number

解构

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

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

typescript
function hd() {
  let a = 'houdunren.com'
  let b = (x: number, y: number): number => x + y
  return [a, b]
}
let [n, m] = hd() //变量 m 的类型为 string | (() => void)

m(1, 6) //报错:因为类型可能是字符串,所以不允许调用

使用 as const 就可以很高效的解决上面的问题,可以得到具体的类型,来得到更安全的代码,同时会有更好的代码提示

typescript
function hd() {
  let a = '后盾人'
  let b = (): void => {}
  return [a, b] as const
}

const [x, y] = hd() //变量 y 的类型为 () => void

非空断言

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

1.可以使用 as 断言类型

typescript
const el: HTMLDivElement = document.querySelector('.hk') as HTMLDivElement

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

typescript
const el: HTMLDivElement = document.querySelector('.hk')!