TypeScript 类型深度解析:any、never、unknown

本文将深入讨论TypeScript的anyneverunknown类型特性以及使用场景。

any: 类型的逃生口

any 类型是TypeScript的万能类型,它允许将任何值 分配给 any 类型的变量,不会在编译时进行类型检查 。虽然 any 提供了灵活性,但它降低了保障,因此谨慎使用。过度的使用 any 等于放弃了 TypeScript的类型安全优势。

适用场景

  • 处理动态内容或不想进行类型检查的时候,可以使用 any 类型。
  • 在使用复杂的对象时,如果类型定义不够清晰或难以确定,可以使用 any 类型。

示例

ts 复制代码
// 使用 any 类型绕过编译时的类型检查
let notSure: any = 4;
notSure = "辰火流光";
notSure = false;

// 使用 any 处理动态内容
function dynamicContent(message: any) {
    console.log(message);
}
dynamicContent({ greeting: "辰火流光" });
dynamicContent("辰火流光");
dynamicContent(42);

never:永不实现的类型

never 类型表示永远不会存在的值 的类型。如果一个函数只会抛出异常错误或永远不会正常结束,那么该函数的返回值类型会是 never

never 类型是所有类型的字类型,可以将never 复制给任何类型,但没有任何类型可以复制给never

适用场景

  • 抛出异常的函数 :如果函数只会抛出异常,从不返回到调用它的地方,可以用 never作为该函数的返回类型。
  • 函数内部死循环。

示例

ts 复制代码
// 抛出异常,函数不会正常结束
function throwError(message: string): never {
    throw new Error(message);
}

// 永远不会达到的代码位置(例如这里有一个死循环)
function infiniteLoop(): never {
    while (true) {
    }
}

unknown:不确定类型的标识

unknown 也表示允许将任何值分配给 unknown 类型的变量,但与 any 不同,你不能对 unknown 类型的变量做任何操作,直到该变量的类型被确定。使用 unknown 类型比使用 any 类型可以使代码更加简装,因为它要求你在对 unknown 类型的变量进行任何操作前明确的进行类型检查或断言。

适用场景

  • 处理外部内容时,不知道会接收到什么类型时,使用 unknown 可以提供类型安全。
  • 作为泛型,在没有足够信息确定类型时的默认类型,它比 any 类型更安全,因为使用 unknown 会强制进行类型检查。

示例

ts 复制代码
// 使用 unknown 接收未知类型的值
let uncertainValue: unknown = "辰火流光";
uncertainValue = 42; // 可以是任何类型

// 在对 unknown 类型操作前需要进行类型检查
if (typeof uncertainValue === "string") {
    console.log(uncertainValue.toUpperCase()); // 可以安全地调用字符串的方法
} else if (typeof uncertainValue === "number") {
    console.log(uncertainValue.toFixed(2)); // 可以安全地调用数字的方法
}

// 使用类型断言将 unknown 类型转换成一个确切的类型
let someValue: unknown = "辰火流光";
let strLength: number = (someValue as string).length; // 使用类型断言

在案例中,我们给 uncertainValue 变量赋值后,在编辑器中输入 . 没有智能提示,因为它不会自动推断类型

如果我们强制输入属性,那么该变量会报错:TS18046: uncertainValue is of type unknown

正确办法是使用类型判断,或者 as 断言

相关推荐
PleaSure乐事几秒前
【React.js】AntDesignPro左侧菜单栏栏目名称不显示的解决方案
前端·javascript·react.js·前端框架·webstorm·antdesignpro
哟哟耶耶1 分钟前
js-将JavaScript对象或值转换为JSON字符串 JSON.stringify(this.SelectDataListCourse)
前端·javascript·json
getaxiosluo2 分钟前
react jsx基本语法,脚手架,父子传参,refs等详解
前端·vue.js·react.js·前端框架·hook·jsx
理想不理想v5 分钟前
vue种ref跟reactive的区别?
前端·javascript·vue.js·webpack·前端框架·node.js·ecmascript
知孤云出岫6 分钟前
web 渗透学习指南——初学者防入狱篇
前端·网络安全·渗透·web
贩卖纯净水.11 分钟前
Chrome调试工具(查看CSS属性)
前端·chrome
栈老师不回家1 小时前
Vue 计算属性和监听器
前端·javascript·vue.js
前端啊龙1 小时前
用vue3封装丶高仿element-plus里面的日期联级选择器,日期选择器
前端·javascript·vue.js
一颗松鼠1 小时前
JavaScript 闭包是什么?简单到看完就理解!
开发语言·前端·javascript·ecmascript
小远yyds2 小时前
前端Web用户 token 持久化
开发语言·前端·javascript·vue.js