🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
>[success] # 断言 -- as ~~~ 1.类型推导会帮我将潜在类型推测出来,但有时候机器并不是绝对的只能,这时候可以用'类型断言'告诉 TypeScript 按照我们的 方式做类型检查。 ~~~ >[danger] ##### 案例 ~~~ 1.以下面案例来看,find 找到大于2的数字必然存在的,但实际来看类型推导给出的如图结果 ~~~ ~~~ const ls: number[] = [1, 2, 3, 4] const getNum = ls.find((item) => item > 2) ~~~ ![](https://img.kancloud.cn/68/ed/68ed58fdbb12beb6f90bc1a4cf2ec8e8_458x110.png) * 此时将上面查找赋值给一个声明为number 变量会报错 ![](https://img.kancloud.cn/64/7b/647bf486157190bb321a389faff34eb5_628x141.png) >[danger] ##### 使用as 断言使其成立 ~~~ const ls: number[] = [1, 2, 3, 4] const getNum:number = ls.find((item) => item > 2) as number // 不在报错 // const getNum: number = <number>ls.find((item) => item > 2) // 其他写法 ~~~ >[danger] ##### as 并不是为所欲为 ~~~ 1.as 作为类型断言来说,并不是想指定是什么类型就可以指定的,类型断言的约束条件: '父子、子父类型之间可以使用类型断言进行转换' ~~~ * string 并不是联合类型 undefined和number 子集 因此断言是无效的 ![](https://img.kancloud.cn/b5/26/b52679db7dead815d6db67c742fef1ac_611x129.png) * 子 父 ~~~ const a:"1" = "1" let aa = a // aa = "3" // 报错 aa = "3" as "1" ~~~ * 父子 ~~~ const ls: number[] = [1, 2, 3, 4] const getNum:number = ls.find((item) => item > 2) as number // 不在报错 ~~~ >[info] ## as const ~~~ 1.“字面量值 + as const”语法结构进行常量断言 ~~~ ~~~ /** str 类型是 '"str"' */ let str = 'str' as const; /** readOnlyArr 类型是 'readonly [0, 1]' */ const readOnlyArr = [0, 1] as const; readOnlyArr.push(1) // 报错 ~~~ ![](https://img.kancloud.cn/92/f8/92f8a957a9aa36547d2b8145dc5b5f90_544x130.png) >[info] ## 指鹿为马 ~~~ 1.有时候两个数据长得一样但是类型不一样,也就指鹿为马情况就可以利用断言向上断言到父类在向下断言到子类 2.解决思路:any 和 unknown 这两个特殊类型属于万金油,因为它们既可以被断言成任何类型,反过来任何类型也都可以被断 言成 any 或 unknown。因此,如果我们想强行“指鹿为马”,就可以先把“鹿”断言为 any 或 unknown,然后再把 any 和 unknown 断言为“马”,比如鹿 as any as 马。 ~~~ ~~~ interface Deer { deerId: number } // 这是马 interface Horse { horseId: number } // 牵出一只鹿 let deer: Deer = { deerId: 0 } // 这样会报错,没法直接指鹿为马 let horse = deer as unknown as Horse // 报错 ~~~