MST

星途 面试题库

面试题:TypeScript中unknown类型与any类型的区别

请详细阐述TypeScript中unknown类型与any类型的区别,并举例说明在何种场景下应优先使用unknown类型而非any类型。
31.2万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

unknown类型与any类型的区别

  1. 类型安全性
    • any类型:是一个非常宽松的类型,它允许你对该类型的值执行任何操作,而不会在编译时进行类型检查。例如:
let valueAny: any = "hello";
valueAny.toUpperCase(); // 正常,因为字符串有该方法
valueAny(); // 这里不会在编译时报错,尽管字符串不能被调用,运行时会报错
- **unknown类型**:是类型安全的,你不能对`unknown`类型的值直接执行操作,除非你先进行类型检查或类型断言。例如:
let valueUnknown: unknown = "hello";
// valueUnknown.toUpperCase(); // 编译错误,不能对unknown类型直接调用方法
if (typeof valueUnknown === "string") {
    valueUnknown.toUpperCase(); // 正确,经过类型检查后可调用字符串方法
}
  1. 赋值兼容性
    • any类型:可以赋值给任何类型,任何类型也可以赋值给any类型。例如:
let num: number = 10;
let anyValue: any = num;
let str: string = anyValue; // 可以,any类型可以赋值给string类型
- **unknown类型**:只能赋值给`unknown`类型本身或`any`类型,其他类型不能直接赋值给`unknown`类型,`unknown`类型也不能直接赋值给其他类型(除`any`外)。例如:
let unk: unknown;
let num: number = 10;
// unk = num; // 编译错误,不能将number类型赋值给unknown类型
unk = num as unknown; // 可以通过类型断言赋值
let str: string;
// str = unk; // 编译错误,不能将unknown类型赋值给string类型
if (typeof unk === "string") {
    str = unk; // 经过类型检查后可赋值
}

优先使用unknown类型的场景

  1. 函数参数接收未知类型数据:当函数需要接收各种可能类型的数据,但又要保证类型安全时,使用unknown类型。例如,一个用于处理用户输入的函数:
function processUserInput(input: unknown) {
    if (typeof input === "string") {
        console.log(input.length);
    } else if (typeof input === "number") {
        console.log(input.toFixed(2));
    }
}
processUserInput("test");
processUserInput(123);
  1. 从第三方库或API获取数据:当从不可信的第三方源获取数据时,使用unknown类型。例如,从一个API获取数据,该API返回的数据结构不确定:
async function fetchData(): Promise<unknown> {
    const response = await fetch('https://example.com/api/data');
    return response.json();
}
fetchData().then(data => {
    if (Array.isArray(data)) {
        console.log(data.length);
    }
});

在这些场景下,unknown类型能在保证类型安全的前提下,处理不确定类型的数据,而any类型可能会引入运行时错误。