TS特殊类型之unknown

unknown类型

首先说明一下,本人是前端小学生级别的菜鸡,吐槽的话请口下留情,在评论区指出错误或者补充不足,我会很喜欢,互喷不会进步,相互指点才会。。。。谢谢大家啦

📌unknown 类型也是顶部类型这与 any 一样

  • unknown 用于表示未知的类型
  • 会进行 TS 的类型检查,any 不进行 TS 检查
  • 使用 unknown 类型时可以使用 as 类型断言来明确类型
  • unknownany的相似之处,在于所有类型的值都可以分配给unknown类型。

下面是 any 与 unknown 赋值上的区别,unknown 需要明确类型后赋值,any 则不需要

typescript 复制代码
let unknownname: any = "akun";
let unknownakun: unknown = "akun001";

let unknowna: string = unknownname;
let unknownb: string = unknownakun; //报错: 'unknown'未知类型不能赋值给'string'类型

// // // unknown 类型需要使用断言明确类型后赋值
let c: string = unknownakun as string;

可以把任何值赋值给 unknown 类型,但在使用时需要指明类型

typescript 复制代码
let unknownakun02: unknown;
unknownakun02 = "akuna"; //ok
unknownakun02 = 1124; //ok

//在使用时,TS不知道是什么类型,所以需要使用类型断言进行告之
let unknownakun03 = (unknownakun02 as number) + 20;

首先,unknown类型的变量,不能直接赋值给其他类型的变量(除了any类型和unknown类型)。

typescript 复制代码
// 直接赋值
let unknownakun04: unknown = 123;
// let unknownakun05: boolean = unknownakun04; //eroor
// let unknownakun06: number = unknownakun04;//error

上面示例中,变量unknownakun04unknown类型,赋值给anyunknown以外类型的变量都会报错,这就避免了污染问题,从而克服了any类型的一大缺点。

📌其次,不能直接调用unknown类型变量的方法和属性。

typescript 复制代码
let v1:unknown = { foo: 123 };
v1.foo  // 报错

let v2:unknown = 'hello';
v2.trim() // 报错

let v3:unknown = (n = 0) => n + 1;
v3() // 报错

上面示例中,直接调用unknown类型变量的属性和方法,或者直接当作函数执行,都会报错

使用 keyof 类型工具时 unknown 与 any 的区别

typescript 复制代码
type AKUN<T> = { [P in keyof T]: string }

//{[x: string]: string;}
type AKUNA= AKUN<any>

//结果为{},因为 keyof unknow 是never,所以被忽略了
type KUN = AKUN<unknown>
typescript 复制代码
type AKUN<T> = { [P in keyof T]: string }

//{[x: string]: string;}
type AKUNA= AKUN<any>

//结果为{},因为 keyof unknow 是never,所以被忽略了
type KUN = AKUN<unknown>

不同类型赋值时会报错

typescript 复制代码
let akun:string ='99'
let age:number =akun as number //报错,TS 认为字符串转数值会出现错误

这里需要使用 unknown 做个中间层转换,将其先转换为 unknown 未知类型,再转换为 string 类型

typescript 复制代码
let akun:string ='99'
let age:number =akun as unknown as number

使用 any 类型 ts 不进行类型校验,所以在编译时不会报错,但执行编译后的 js 后会显示 NaN

typescript 复制代码
function get(val: any) {
  val = val * 100;
  return val
}

console.log(get('akun'));  //NaN

使用 unknown 类型时,结合 typeof 进行类型判断,根据不同类型使用不同逻辑,慢慢进行缩小范围

typescript 复制代码
function get(val: unknown) {
  if (typeof val === 'number') {
    return val * 100;
  }
  return 0
}
console.log(get(100));  //NaN
相关推荐
胡桃夹夹子5 分钟前
【前端优化】vue2 webpack4项目升级webpack5,大大提升运行速度
前端·javascript·vue.js·webpack·性能优化
Stringzhua10 分钟前
JavaScript【7】BOM模型
开发语言·前端·javascript
DT——18 分钟前
ECMAScript 2018(ES2018):异步编程与正则表达式的深度进化
开发语言·javascript·ecmascript
阿幸软件杂货间26 分钟前
谷歌浏览器(Google Chrome)136.0.7103.93便携增强版|Win中文|安装教程
前端·chrome
双叶83632 分钟前
(C语言)超市管理系统 (正式版)(指针)(数据结构)(清屏操作)(文件读写)(网页版预告)(html)(js)(json)
c语言·javascript·数据结构·html·json
繁依Fanyi1 小时前
Animaster:一次由 CodeBuddy 主导的 CSS 动画编辑器诞生记
android·前端·css·编辑器·codebuddy首席试玩官
想起你的日子1 小时前
Android studio 实现弹出表单编辑界面
java·前端·android studio
LuckyLay2 小时前
Vue百日学习计划Day9-15天详细计划-Gemini版
前端·vue.js·学习
weifont6 小时前
聊一聊Electron中Chromium多进程架构
javascript·架构·electron
大得3696 小时前
electron结合vue,直接访问静态文件如何跳转访问路径
javascript·vue.js·electron