面试题答案
一键面试unknown类型与any类型的区别
- 类型安全性
- any类型:是一个非常宽松的类型,它允许你对该类型的值执行任何操作,而不会在编译时进行类型检查。例如:
let valueAny: any = "hello";
valueAny.toUpperCase(); // 正常,因为字符串有该方法
valueAny(); // 这里不会在编译时报错,尽管字符串不能被调用,运行时会报错
- **unknown类型**:是类型安全的,你不能对`unknown`类型的值直接执行操作,除非你先进行类型检查或类型断言。例如:
let valueUnknown: unknown = "hello";
// valueUnknown.toUpperCase(); // 编译错误,不能对unknown类型直接调用方法
if (typeof valueUnknown === "string") {
valueUnknown.toUpperCase(); // 正确,经过类型检查后可调用字符串方法
}
- 赋值兼容性
- any类型:可以赋值给任何类型,任何类型也可以赋值给
any
类型。例如:
- any类型:可以赋值给任何类型,任何类型也可以赋值给
let num: number = 10;
let anyValue: any = num;
let str: string = anyValue; // 可以,any类型可以赋值给string类型
- **unknown类型**:只能赋值给`unknown`类型本身或`any`类型,其他类型不能直接赋值给`unknown`类型,`unknown`类型也不能直接赋值给其他类型(除`any`外)。例如:
let unk: unknown;
let num: number = 10;
// unk = num; // 编译错误,不能将number类型赋值给unknown类型
unk = num as unknown; // 可以通过类型断言赋值
let str: string;
// str = unk; // 编译错误,不能将unknown类型赋值给string类型
if (typeof unk === "string") {
str = unk; // 经过类型检查后可赋值
}
优先使用unknown类型的场景
- 函数参数接收未知类型数据:当函数需要接收各种可能类型的数据,但又要保证类型安全时,使用
unknown
类型。例如,一个用于处理用户输入的函数:
function processUserInput(input: unknown) {
if (typeof input === "string") {
console.log(input.length);
} else if (typeof input === "number") {
console.log(input.toFixed(2));
}
}
processUserInput("test");
processUserInput(123);
- 从第三方库或API获取数据:当从不可信的第三方源获取数据时,使用
unknown
类型。例如,从一个API获取数据,该API返回的数据结构不确定:
async function fetchData(): Promise<unknown> {
const response = await fetch('https://example.com/api/data');
return response.json();
}
fetchData().then(data => {
if (Array.isArray(data)) {
console.log(data.length);
}
});
在这些场景下,unknown
类型能在保证类型安全的前提下,处理不确定类型的数据,而any
类型可能会引入运行时错误。