TS 中 any 和 unkown 的区别

作者: 弱冠而不立 | 来源:发表于2021-04-01 00:59 被阅读0次

    unknown 和 any 的主要区别是 unknown 类型会更加严格:在对 unknown 类型的值执行大多数操作之前,我们必须进行某种形式的检查。而在对 any 类型的值执行操作之前,我们不必进行任何检查。

    举例说明:

    let foo: any = 123;
    console.log(foo.msg); // 符合TS的语法
    let a_value1: unknown = foo;   // OK
    let a_value2: any = foo;      // OK
    let a_value3: string = foo;   // OK
    
    
    let bar: unknown = 222; // OK 
    console.log(bar.msg); // Error
    let k_value1: unknown = bar;   // OK
    let K_value2: any = bar;      // OK
    let K_value3: string = bar;   // Error
    

    因为bar是一个未知类型(任何类型的数据都可以赋给 unknown 类型),所以不能确定是否有msg属性。不能通过TS语法检测;而 unkown 类型的值也不能将值赋给 any 和 unkown 之外的类型变量

    总结: any 和 unknown 都是顶级类型,但是 unknown 更加严格,不像 any 那样不做类型检查,反而 unknown 因为未知性质,不允许访问属性,不允许赋值给其他有明确类型的变量

    联合类型中的 unkown

    在联合类型中,unknown 类型会吸收任何类型。这就意味着如果任一组成类型是 unknown,联合类型也会相当于 unknown

    type UnionType1 = unknown | null;       // unknown
    type UnionType2 = unknown | undefined;  // unknown
    type UnionType3 = unknown | string;     // unknown
    type UnionType4 = unknown | number[];   // unknown
    

    意外是 any 类型。如果至少一种组成类型是 any,联合类型会相当于 any

    type UnionType5 = unknown | any;  // any
    

    交叉类型中的 unkown

    type IntersectionType1 = unknown & null;       // null
    type IntersectionType2 = unknown & undefined;  // undefined
    type IntersectionType3 = unknown & string;     // string
    type IntersectionType4 = unknown & number[];   // number[]
    type IntersectionType5 = unknown & any;        // any
    

    由于每种类型都可以赋值给 unknown 类型,所以在交叉类型中包含 unknown 不会改变结果。我们将只剩下 string 类型。

    那如何将 unknown 类型指定为一个更具体的类型呢?

    • 使用 typeof 进行类型判断(这些缩小类型范围的技术都有助于TS基于控制流程下的类型分析)
      function unknownToString(value: unknown): string {
        if (typeof value === "string") {
         return value;
        }
      
        return String(value);
      }
    
    • 对 unknown 类型使用类型断言
      要强制编译器信任类型为 unknown 的值为给定类型,则可以使用类型断言:
      const value: unknown = "Hello World";
      const foo: string = value; // Error
      const bar: string = value as string; // OK
    

    断言错了时语法能通过检测,但是运行的时候就会报错了!

      const value: unknown = "Hello World";
    
      const bar: number = value as number; // runtime Error
    

    相关文章

      网友评论

        本文标题:TS 中 any 和 unkown 的区别

        本文链接:https://www.haomeiwen.com/subject/obhbqltx.html