Skip to content

231211-231215

作者:guo-zi-xin
更新于:9 个月前
字数统计:616 字
阅读时长:2 分钟

23-12-13 ❄️

Typescript中anyunknown

  • any

    any类型表示没有任何限制,该类型的变量可以赋予任意类型的值。

    一旦设置为any类型, TypeScript 实际上会关闭这个变量的类型检查。即使有明显的类型错误,只要句法正确,都不会报错。

    any类型由于跳过了类型检查,它可以随意赋值, 所以可能会带来变量的污染

  • unknown

    unknown是 TypeScript 3.0 引入的类型,它代表了一个未知的类型。

    unknown 类型要求进行类型检查和类型断言,以便在使用前确定其实际类型。

    unknown类型不能够直接使用, 而any类型是可以的

    typescript
    // unknown类型赋值给除了 unknown 和 any 类型不会报错, 其它都会报错
    let known: unknown = 123;
    let known1 :boolean = v; // 报错
    let known2 :number = v; // 报错

    unknown类型也不能够直接调用上面的方法和属性

    typescript
    let known: unknown = { foo: 123 };
    known.foo // 报错
    
    let known2: unknown = 'hello'
    known2.trim() // 报错
    
    let known3: unknown = ( n = 0 ) => n + 1
    known3() // 报错

    unknown类型变量能够进行的运算是有限的, 只支持比较运算: 运算符=====!=!==||&&?; 取反运算!typeof运算符和instance运算符这几种, 其它都会报错

    typescript
    let aa: unknown = 1
    
    a + 1 // 报错
    a === 1 // 不报错 返回true

unknown使用位置

我们可以通过类型守卫(typeofinstanceof操作符这些)来限制类型范围, 在操作符的加持下, 我们就可以使用unknown类型变量

typescript
let aa:unknown = 1

if (typeof aa === 'number') {
 let bb = aa + 10 // 可以正常运行
}

Typescript中的never类型

为了保持与集合论的对应关系,以及类型运算的完整性,TypeScript 还引入了“空类型”的概念,即该类型为空,不包含任何值

  • 使用场景

    主要是在一些类型运算中,保证类型的完整性,例如在一个联合类型中, 通过类型守卫进行类型范围缩小后,剩余的情况就是never类型

    typescript
    
    const fun = (value: string | number) => {
      if (typeof value === 'string') {
        // 此时为 string 类型
      } else if (typeof value === 'number') {
        // 此时为 number 类型
      } else {
        // 此时为 never 类型
      }
    }

never类型可以复制给任意其它类型

typescript
const fun1 = ():never => {
 throw new Error('Error')
}

let aa: number = fun1() //正常运行
let bb: string = fun1() //正常运行
let cc: boolean = fun1() //正常运行

Typescript中有两个 "顶层类型" (anyunknown), 只有一个"底层类型"(never)

人生没有捷径,就像到二仙桥必须要走成华大道。