注意:如果您是 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
可以防止运行时错误。
另请阅读