Reputation: 757
I am JS developer and new to TS. If I have the following line of code:
let corners = Boolean(checkTypes[userAccess]);
if I change it to this:
let corners = Boolean(checkTypes![userAccess]);
why is that frowned upon? I had a comment saying non null assertions are not a runtime check so when would they happen?
Upvotes: 2
Views: 458
Reputation: 1074989
Non-null assertions are not done at runtime?
Correct, the JavaScript code will be just:
let corners = Boolean(checkTypes[userAccess]);
...and as a result, if checkTypes
is nullish, that code will throw.
so when would they happen?
They won't, unless you code them. Type assertions are just that: assertions. You're promising TypeScript that you know that the assertion is true. TypeScript doesn't insert code to check that you're right. You've asserted that you are right.
Some options for you:
If you want a checked assertion, you can write an assertion function (sadly not yet documented in the handbook):
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`);
}
}
Then your code would be:
assertIsNotNullish(checkTypes, "checkTypes was unexpectedly nullish");
let corners = Boolean(checkTypes[userAccess]); // No assertion needed
Optional chaining and nullish coalescing (both now JavaScript features):
// Assuming you want `false` if `checkTypes` is nullish
let corners = Boolean(checkTypes?.[userAccess] ?? false);
// ^^ ^^^^^^^^^^
You could have a type predicate:
function isNotNullish<T>(value: T | null | undefined): value is T {
return value != null; // Which checks both `null` and `undefined`
}
and then
let corners = isNotNullish(checkTypes)
? Boolean(checkTypes[userAccess])
: false; // Or `true` if that should be the default
Upvotes: 1