MST

星途 面试题库

面试题:TypeScript中更精确的any变体应用基础

请解释TypeScript中`unknown`类型与`any`类型的主要区别,并举例说明在什么场景下应优先使用`unknown`。同时,写出一段代码展示如何安全地处理`unknown`类型的值并转换为具体类型。
34.2万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

unknown类型与any类型的主要区别

  1. 类型安全性
    • any类型是一种宽松的类型,它允许对值进行任意操作,而不进行类型检查。这意味着在编译时不会对any类型的值进行类型错误检测,可能会在运行时出现类型相关的错误。
    • unknown类型是一种更加安全的类型,它表示值可以是任何类型,但在对其进行操作之前,必须先进行类型检查或类型断言,以确保类型安全。
  2. 赋值兼容性
    • 可以将任何类型的值赋给any类型的变量,同时any类型的值也可以赋值给其他任何类型的变量。
    • 只能将unknown类型的值赋给unknown类型或any类型的变量。要将unknown类型的值赋给其他具体类型的变量,需要进行类型检查或类型断言。

优先使用unknown的场景

当你不确定一个值的类型,但又希望保持类型安全性时,应优先使用unknown类型。例如,当从外部数据源(如用户输入、API响应等)获取数据时,数据的类型是不确定的,此时使用unknown类型可以防止潜在的类型错误。

安全处理unknown类型的值并转换为具体类型的代码示例

function processValue(value: unknown) {
    if (typeof value ==='string') {
        // 通过类型检查后,value被自动推断为string类型
        console.log(value.length);
    } else if (Array.isArray(value)) {
        // 通过类型检查后,value被自动推断为数组类型
        console.log(value.length);
    } else {
        console.log('Unsupported type');
    }
}

// 调用函数并传入不同类型的值
processValue('Hello');
processValue([1, 2, 3]);
processValue(42);

在上述代码中,processValue函数接受一个unknown类型的参数value。通过使用typeofArray.isArray等类型检查方法,确保在对value进行操作之前,它是预期的类型,从而避免潜在的类型错误。