我是JS开发人员和TS新手,如果我有以下代码行:
let corners = Boolean(checkTypes[userAccess]);
如果我把它改成这样:
let corners = Boolean(checkTypes![userAccess]);
为什么不赞成?我有一个评论说非空断言不是运行时检查,所以什么时候会发生?
正确,JavaScript代码将是:非空断言在运行时不完成?
let corners = Boolean(checkTypes[userAccess]);
…因此,如果checkTypes
为null,该代码将抛出。
那么他们什么时候会发生呢?
它们不会,除非你对它们进行编码。类型断言就是断言。你向TypeScript保证你知道断言是正确的。TypeScript不会插入代码来检查你是否正确。你已经断言你是对的。
给你的一些选项:
如果你想要一个被检查的断言,你可以写一个断言函数(遗憾的是还没有在手册中记录):
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
可选链接和空合并(现在都是JavaScript的特性):
// Assuming you want `false` if `checkTypes` is nullish let corners = Boolean(checkTypes?.[userAccess] ?? false); // ^^ ^^^^^^^^^^
你可以有一个类型谓词:
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