fe-interview icon indicating copy to clipboard operation
fe-interview copied to clipboard

[TypeScript] 第1515天 在TypeScript中any和unkown有什么区别?

Open haizhilin2013 opened this issue 2 years ago • 3 comments

第1515天 在TypeScript中any和unkown有什么区别?

3+1官网

我也要出题

haizhilin2013 avatar Jun 08 '23 20:06 haizhilin2013

虽然都是表示未知类型,但是any上任何操作都是合法的,unknown类型上任何操作都是非法的

gqfx avatar Jun 13 '23 12:06 gqfx

any 类型可以赋予任意值,并且对其进行任意操作不会报错,不进行类型检查。 unknown 类型也可以赋予任意值,但对其进行操作时必须进行类型检查或类型断言,提供了更安全的方式来处理类型不确定的情况。

一般来说,应尽量避免使用 any 类型,因为它会降低 TypeScript 的类型检查能力,增加代码的不确定性。相比之下,unknown 类型提供了更严格的类型检查,能够在编写类型安全的代码时更好地处理类型不确定的情况。

hemengzhao avatar Sep 26 '23 03:09 hemengzhao

在TypeScript中,anyunknown都是可以表示任意类型的顶级类型,但它们的行为和用途有很大的区别。了解它们之间的区别对于编写类型安全的代码至关重要。

any 类型

  • 宽松的类型检查:使用any类型,TypeScript基本上会放弃对该变量的类型检查。这意味着你可以对any类型的值进行任何操作,而不会得到编译错误。
  • 缺乏类型安全性any类型的主要缺点是它缺乏类型安全性。使用any类型可能会导致在运行时出现类型错误,因为编译器无法捕获类型错误。

示例:

let value: any;

value = 42;
value = "hello";
value = true;

value.foo();  // 没有编译错误,但在运行时可能会崩溃
value.bar = 123;

unknown 类型

  • 严格的类型检查unknown类型提供了类型安全性。你可以将任何类型的值赋给unknown类型的变量,但在对它进行操作之前,你必须先进行类型检查或类型断言。
  • 类型安全:使用unknown类型,可以确保在使用变量之前进行必要的类型检查,从而提高代码的安全性和可靠性。

示例:

let value: unknown;

value = 42;
value = "hello";
value = true;

// 不能直接对unknown类型的值进行操作,需要进行类型检查或类型断言
if (typeof value === "string") {
    console.log(value.toUpperCase());  // 现在编译器知道value是一个字符串
}

if (typeof value === "number") {
    console.log(value.toFixed(2));  // 现在编译器知道value是一个数字
}

any vs unknown 的对比

  1. 赋值兼容性

    • anyunknown都可以接受任何类型的值。
    • 任何类型的值都可以赋给any
    • 任何类型的值都可以赋给unknown
  2. 操作限制

    • any类型的值可以进行任何操作,而不会有编译错误。
    • unknown类型的值进行操作之前,必须进行类型检查或类型断言。
  3. 类型安全性

    • any类型会导致类型检查的丧失,可能会引入运行时错误。
    • unknown类型提供了类型安全性,确保在使用之前进行类型检查,从而减少运行时错误。

示例对比

使用 any

function logValue(value: any) {
    console.log(value.toFixed(2));  // 没有编译错误,但如果value不是数字,运行时会出错
}

logValue(123.456);  // 正常工作
logValue("hello");  // 运行时错误

使用 unknown

function logValue(value: unknown) {
    if (typeof value === "number") {
        console.log(value.toFixed(2));  // 编译器知道value是数字
    } else {
        console.log("Not a number");  // 处理非数字情况
    }
}

logValue(123.456);  // 正常工作
logValue("hello");  // 输出: Not a number

总结

  • any:提供灵活性,但缺乏类型安全性。适用于快速原型开发或需要临时禁用类型检查的情况,但不推荐在生产代码中广泛使用。
  • unknown:提供类型安全性,适用于处理不确定类型的值。需要在使用之前进行类型检查或类型断言,是更推荐的做法。

使用unknown类型可以显著提高代码的安全性和可靠性,避免许多运行时错误,而any类型虽然方便但可能会导致隐蔽的错误。

llccing avatar Jun 26 '24 06:06 llccing