interview
typescript-frontend
什么是 TypeScript 的 unknown 类型和 any 类型有什么区别

前端 TypeScript 面试题, 什么是 TypeScript 的 unknown 类型?和 any 类型有什么区别?

前端 TypeScript 面试题, 什么是 TypeScript 的 unknown 类型?和 any 类型有什么区别?

QA

Step 1

Q:: 什么是 TypeScript 的 unknown 类型?

A:: TypeScript 的 unknown 类型是 TypeScript 3.0 引入的一种类型,它用于表示任何类型的值,但在对 unknown 类型的值进行操作之前,必须先进行类型检查或类型断言。相比于 any 类型,unknown 类型更加安全,因为它要求开发者在操作它之前明确了解它的类型。

Step 2

Q:: unknown 类型和 any 类型有什么区别?

A:: unknown 类型与 any 类型的主要区别在于,unknown 类型比 any 更加严格。使用 any 类型时,你可以对该类型的值进行任何操作而不会出现类型错误,而使用 unknown 类型时,你必须首先执行类型检查,否则会出现编译错误。因此,unknown 类型可以帮助开发者避免不必要的错误和类型不一致的问题。

Step 3

Q:: 如何使用 unknown 类型进行类型保护?

A:: 在使用 unknown 类型时,您需要通过类型检查(如使用 typeof、instanceof 或类型断言)来确保在操作该值之前已经确定了其类型。例如:

 
let value: unknown;
if (typeof value === 'string') {
  console.log(value.toUpperCase());
}
 

在上例中,只有在确定 value 是字符串类型后,才可以对其调用 toUpperCase 方法。

Step 4

Q:: 什么时候使用 unknown 类型?

A:: 当你处理用户输入或外部 API 数据时,可以使用 unknown 类型来表示你无法确定类型的变量。这可以强制你在使用这些值之前进行适当的类型检查,从而避免意外的类型错误。

用途

面试 unknown 类型主要是为了考察候选人对类型安全的理解,以及他们在使用 TypeScript 时是否能够正确地管理和保护类型。unknown 类型在实际生产环境中非常重要,特别是在处理不确定类型的数据时,例如用户输入或第三方 API 的返回值。在这种情况下,使用 unknown 可以强制开发者进行类型检查,从而减少运行时错误,提升代码的稳定性和可靠性。\n

相关问题

🦆
什么是 TypeScript 的类型推断?

TypeScript 的类型推断是指编译器在没有明确指定类型时,自动推断变量或表达式的类型。例如:

 
let x = 5;
 

在上面的例子中,编译器会推断 x 的类型为 number。类型推断可以帮助简化代码,但在需要明确类型时,建议手动指定。

🦆
什么是类型断言?什么时候应该使用?

类型断言允许你覆盖 TypeScript 的类型推断,并告诉编译器某个值的确切类型。使用类型断言的语法是:

 
let value: any = 'hello';
let strLength: number = (value as string).length;
 

类型断言通常在你非常确定某个值的类型且编译器无法自动推断时使用。

🦆
如何在 TypeScript 中定义自定义类型守卫?

自定义类型守卫是一种将复杂的类型检查逻辑封装为函数的方式,用于增强类型保护。你可以通过创建一个返回值类型为 arg is Type 的函数来定义类型守卫,例如:

 
function isString(value: any): value is string {
  return typeof value === 'string';
}
 

这种类型守卫可以在 if 语句中使用,从而缩小代码块中的类型范围。

🦆
什么时候应该使用 any 类型?

any 类型通常在你需要处理动态内容且不关心类型的情况下使用,例如处理第三方库、快速原型设计或将旧 JavaScript 代码迁移到 TypeScript 时。但应谨慎使用 any 类型,因为它会绕过 TypeScript 的类型检查,从而降低代码的类型安全性。