MST

星途 面试题库

面试题:TypeScript中any与unknown类型在类型断言方面的差异及应用

在TypeScript中,当使用类型断言将变量转换为其他具体类型时,any类型和unknown类型的操作方式有什么不同?请结合代码示例详细说明,并且解释为什么会存在这样的差异以及在实际开发场景中如何正确使用这些类型断言。
41.1万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
  1. any类型的类型断言
    • 操作方式:在TypeScript中,any类型可以直接断言为其他任意类型。因为any类型表示可以是任何类型,所以TypeScript对any类型的断言限制较少。
    • 代码示例
    let value: any = 'hello';
    let length: number = (value as string).length;
    
    • 原因any类型关闭了TypeScript的类型检查,编译器不会对any类型的值进行严格的类型检查,所以可以轻松断言为其他类型。
  2. unknown类型的类型断言
    • 操作方式unknown类型不能直接断言为其他具体类型,需要先进行类型缩小操作,例如通过typeofinstanceof等检查,确保其实际类型与要断言的类型匹配后才能断言。
    • 代码示例
    let unknownValue: unknown = 'world';
    if (typeof unknownValue ==='string') {
        let newLength: number = (unknownValue as string).length;
    }
    
    • 原因unknown类型是TypeScript中最顶级的类型,它表示值可以是任何类型,但为了类型安全,不允许在未确定其实际类型前直接断言为其他具体类型。这是为了防止运行时错误,因为unknown类型的值可能是任何类型,如果直接断言可能导致类型不匹配的错误。
  3. 实际开发场景中的正确使用
    • 使用any类型断言:在处理一些遗留代码,或者确实无法提前知晓类型且对类型安全要求不高的情况下,可以使用any类型断言。但要谨慎使用,因为这会绕过TypeScript的类型检查,增加潜在的运行时错误风险。
    • 使用unknown类型断言:在处理来自外部不受信任数据源的数据时,使用unknown类型更合适。先进行类型缩小检查,再进行类型断言,这样可以在保证类型安全的前提下,对数据进行相应操作。例如在处理JSON.parse返回的数据时,返回值类型为unknown,就需要先检查类型再断言。
    let jsonStr = '{"name":"John"}';
    let data: unknown = JSON.parse(jsonStr);
    if (typeof data === 'object' && data!== null) {
        let obj = data as { name: string };
        console.log(obj.name);
    }