Skip to content

面试题

1. ts中any和unkown的区别是什么?

any和unknown的区别 any类型是ts的一个特殊类型,它可以表示任何类型的值。 unkown类型是ts的一个特殊类型,它可以表示任何类型的值,但是在使用时需要进行类型检查。

特性anyunknown
类型检查完全跳过强制要求
赋值给其他类型可以赋值给任何类型只能赋值给 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类型