注意:如果您是 TypeScript 新手,请先查看 TypeScript 入门 教程。
TypeScript 中的 unknown 数据类型可以保存任何值,但在执行操作之前需要进行类型验证。
以下是 unknown 类型的一个简单示例。您可以阅读本教程的其余部分以了解更多信息。
示例
let userInput: unknown = "Hello";
// Type checking
if (typeof userInput === "string") {
// Now it's safe to use string methods
console.log(userInput.toUpperCase());
}
// Output: HELLO
在此,userInput 被声明为 unknown,并且要执行字符串操作,我们必须首先通过类型检查来验证它是否为字符串。
声明一个 unknown 类型变量
要使用 unknown 类型声明变量,只需在类型注解中使用 unknown 关键字即可。例如:
let variableName: unknown;
将变量声明为 unknown 会告知编译器该变量的类型尚不确定,将在稍后确定。
在函数中使用 unknown
我们也可以在函数参数类型中使用 unknown。例如:
function handleData(input: unknown) {
// Check if the input is an array
if (Array.isArray(input)) {
console.log(input);
}
// Check if the input is a string
else if (typeof input === "string") {
console.log(input.toUpperCase());
}
}
// Call the function with different types of inputs
handleData("programiz");
handleData([1, 2, 3]);
输出
PROGRAMIZ [1, 2, 3]
这里,函数 handleData() 使用 if-else 条件来确定 input 的性质。
- 它使用
Array.isArray(input)检查input是否为数组。如果为true,则会记录该数组。 - 如果
input是字符串,如typeof input === "string"所示,它将以大写形式记录该字符串。
TypeScript any vs unknown
any 和 unknown 都是 TypeScript 中可以保存任何值的类型,但它们在强制执行类型安全方面有所不同。
any 类型
它允许在不进行检查的情况下对任何类型执行操作,这可能导致潜在的运行时错误。例如:
let value: any = "Hello";
// Works fine, outputs: "HELLO"
console.log(value.toUpperCase());
value = 123;
// No error at compile time, but will crash at runtime
console.log(value.toUpperCase());
unknown 类型
它要求在执行操作之前进行显式类型检查,从而提高了代码的安全性。考虑一个声明为 unknown 的变量 value。
let value: unknown = "Hello";
由于 unknown 是 any 的类型安全对应项,TypeScript 会在对 value 执行任何操作之前强制执行检查。
if (typeof value === "string") {
console.log(value.toUpperCase());
}
直接在 value 上调用 toUpperCase() 方法会产生编译时错误,因为 TypeScript 要求在执行类型特定操作之前显式确认类型。
let value: unknown = "Hello";
// Runtime Error: 'value' is of type 'unknown'
console.log(value.toUpperCase());
使用 unknown 可以防止运行时错误。
另请阅读