全部 / 前端 / 技术 · 2022年9月15日 0

TypeScript 中 !

ts

在 JavaScript 中 ! 一般表示为取反且转换为 Boolean 值。

!0 // true
!'' // true
!-1 // false

在 TypeScript 中它还有一个名字: Non-null assertion operator,即为非空判断。

A new ! post-fix expression operator may be used to assert that its operand is non-null and non-undefined in contexts where the type checker is unable to conclude that fact.

就是说类型检查器不能准确检测类型时,! 就用来强制告诉它这里非空(null、undefined)。

简单来说:就是把操作数的值域中排除 null 和 undefined

例子:

  1. 一个类实现了一个接口,接口中一个字段可选,但是类中的那个字段肯定存在,实现如下:
interface B {
    name?:string,
}

class A implements B {
    name!:string
}
  1. 强制链式调用
myObject.name!.length

就是告诉编译器 name 肯定存在。

  1. 不够聪明的类型检测
function isValid(x: any): boolean {
  return x !== undefined && x !== null;
}

function test(y?: string): string {
  if (isValid(y)) {
    return y.toLowerCase(); // 在 isValid 分支内,y 明明不可能是 undefined,为何还报错『Object is possibly 'undefined'.(2532)』?🤔
  }

  return '';
}

原因是 TypeScript 不能检测运行时错误,如果把 isValid 改为内联类型则可以解决:

function test(y?:string):string{
    if(y !== undefined && y !== null){
        return y.toLowerCase()
    }
    return ''
}

若我们的判断很复杂或者想复用,这种方法就不是很理想,此时 ! 就可以解决:

function test(y?: string): string {
  if (isValid(y)) {
    return y!.toLowerCase(); // y 经过函数校验后不可能是 undefined,我们可通过非空断言告知 TS
  }

  return '';
}