面试题
1. ts中any和unkown的区别是什么?
any和unknown的区别 any类型是ts的一个特殊类型,它可以表示任何类型的值。 unkown类型是ts的一个特殊类型,它可以表示任何类型的值,但是在使用时需要进行类型检查。
特性 | any | unknown |
---|---|---|
类型检查 | 完全跳过 | 强制要求 |
赋值给其他类型 | 可以赋值给任何类型 | 只能赋值给 any 和 unknown |
访问属性/方法 | 无限制访问 | 必须先进行类型守卫 |
运算操作 | 无限制 | 必须先进行类型检查 |
编译时安全性 | ❌ 不安全 | ✅ 安全 |
ts
// 使用 any
function processAny(value: any) {
console.log(value.foo.bar); // ✅ 编译通过,但运行时可能报错
value.nonExistentMethod(); // ✅ 编译通过,但运行时可能报错
return value * 2; // ✅ 编译通过,但运行时可能报错
}
// 使用 unknown
function processUnknown(value: unknown) {
console.log(value.foo.bar); // ❌ 编译错误
value.nonExistentMethod(); // ❌ 编译错误
return value * 2; // ❌ 编译错误
}
// any: 类型系统的"逃生舱"
let anyValue: any = 42;
let stringValue: string = anyValue; // ✅ 可以赋值给任何类型
let numberValue: number = anyValue; // ✅ 可以赋值给任何类型
// unknown: 类型系统的"顶级类型"
let unknownValue: unknown = 42;
let stringValue2: string = unknownValue; // ❌ 不能直接赋值
let numberValue2: number = unknownValue; // ❌ 不能直接赋值
2. 方法value不可以使用number,其他都可以,如果实现?
通过never类型,我们可以实现value不可以使用number,其他都可以的效果。因为never类型是一个底部类型,它不能被赋值给任何类型,包括number类型。
ts
type BanedType<T, U> = T extends U ? never : T
// value 不可以使用number,其他都可以,如果实现?
function method<T>(value: BanedType<T, number>) {
}
method('hello') // ✅ 可以赋值给任何类型
method({ a: 1 }) // ✅ 可以赋值给任何类型
method(123) // ❌ 不能赋值给number类型