在 TypeScript 3.0 中,新增了一个名为 unknown
的类型。根据 TypeScript 文档的描述,unknown
是一个内置的类型,任何类型的值都可以赋值给 unknown
,但 unknown
类型的值只能赋值给 unknown
或 any
类型。这意味着 unknown
是类型安全的 any
类型。那么,unknown
和 any
有什么区别呢?我们应该在什么时候使用 unknown
而不是 any
呢?本文将详细探讨这些问题。
any
与 unknown
的基本区别
-
any
类型:- 任何类型的值都可以赋值给
any
。 any
类型的值可以赋值给任何其他类型。- 可以对
any
类型的值执行任何操作,而不会触发类型检查。
let vAny: any = 10; let s: string = vAny; // 允许 vAny.method(); // 允许,即使 `vAny` 可能没有 `method` 方法
- 任何类型的值都可以赋值给
-
unknown
类型:- 任何类型的值都可以赋值给
unknown
。 unknown
类型的值只能赋值给unknown
或any
。- 在对
unknown
类型的值执行任何操作之前,必须进行类型检查。
let vUnknown: unknown = 10; let s: string = vUnknown; // 不允许,必须进行类型断言 vUnknown.method(); // 不允许,必须先进行类型检查
- 任何类型的值都可以赋值给
何时使用 unknown
而不是 any
unknown
类型通常用于需要更严格的类型检查的场景。使用 unknown
可以确保开发者在使用值之前执行适当的类型检查,从而提高代码的类型安全性。这在设计 API 时尤其有用,因为它能强制调用者在使用返回值前进行类型检查。
示例:使用 unknown
进行类型检查
function doSomething(value: unknown) {
if (typeof value === "string") {
console.log(value.toUpperCase()); // 允许,经过类型检查,value 被识别为 string
} else {
console.log("Not a string");
}
}
doSomething("Hello");
doSomething(10);
在上述代码中,doSomething
函数接收一个 unknown
类型的参数。我们在使用 value
之前进行了类型检查,确保只有在 value
是字符串时才调用 toUpperCase
方法。
总结
unknown
和 any
都可以持有任何类型的值,但它们在类型检查上的行为有所不同。any
允许在不进行任何类型检查的情况下进行任何操作,而 unknown
则强制开发者在使用值之前进行类型检查。因此,在需要类型安全的场景下,建议优先使用 unknown
。
通过了解和使用 unknown
类型,我们可以编写出更加健壮和类型安全的 TypeScript 代码。希望本文能帮助你更好地理解 unknown
与 any
的区别,并在合适的场景中正确使用它们。