TS:非空断言在运行时不完成?



我是JS开发人员和TS新手,如果我有以下代码行:

let corners = Boolean(checkTypes[userAccess]);

如果我把它改成这样:

let corners = Boolean(checkTypes![userAccess]);

为什么不赞成?我有一个评论说非空断言不是运行时检查,所以什么时候会发生?

非空断言在运行时不完成?

正确,JavaScript代码将是:
let corners = Boolean(checkTypes[userAccess]);

…因此,如果checkTypes为null,该代码将抛出。

那么他们什么时候会发生呢?

它们不会,除非你对它们进行编码。类型断言就是断言。你向TypeScript保证你知道断言是正确的。TypeScript不会插入代码来检查你是否正确。你已经断言你是对的。

给你的一些选项:

  1. 如果你想要一个被检查的断言,你可以写一个断言函数(遗憾的是还没有在手册中记录):

    function assertIsNotNullish<T>(
    value: T | null | undefined,
    message?: string,
    ): asserts value is T {
    if (value == null) { // Which checks both `null` and `undefined`
    throw new Error(message ?? `Expected non-nullish value`);
    }
    }
    

    那么你的代码将是:

    assertIsNotNullish(checkTypes, "checkTypes was unexpectedly nullish");
    let corners = Boolean(checkTypes[userAccess]); // No assertion needed
    
  2. 可选链接和空合并(现在都是JavaScript的特性):

    // Assuming you want `false` if `checkTypes` is nullish
    let corners = Boolean(checkTypes?.[userAccess] ?? false);
    //                              ^^            ^^^^^^^^^^
    
  3. 你可以有一个类型谓词:

    function isNotNullish<T>(value: T | null | undefined): value is T {
    return value != null; // Which checks both `null` and `undefined`
    }
    

    let corners = isNotNullish(checkTypes)
    ? Boolean(checkTypes[userAccess])
    : false; // Or `true` if that should be the default
    

最新更新