== Why is this an issue?

The TypeScript compiler automatically casts a variable to the relevant type inside conditionals where it is possible to infer the type (because ``++typeof++``, ``++instanceof++``, etc was used). This compiler feature makes casts and not-``++null++`` assertions unnecessary.


=== Noncompliant code example

[source,javascript]
----
function getName(x?: string | UserName) {
  if (x) {
    console.log("Getting name for " + x!); // Noncompliant

    if (typeof x === "string")
      return (x as string); // Noncompliant
    else
      return (x as UserName).name; // Noncompliant
  }
  return "NoName";
}
----


=== Compliant solution

[source,javascript]
----
function getName(x?: string | UserName) {
  if (x) {
    console.log("Getting name for " + x);

    if (typeof x === "string")
      return x;
    else
      return x.name;
  }
  return "NoName";
}
----


ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

=== Message

Remove this unnecessary [cast|not-null assertion].


=== Highlighting

The cast or not-null assertion.


'''
== Comments And Links
(visible only on this page)

=== on 14 Nov 2017, 20:56:16 Ann Campbell wrote:
\[~jeanchristophe.collet] "and when property values set at type definition are checked" is not clear to me. Would it be fair to reword to something like:


____
inside conditions that test the object type, either with ``++.kind++`` or ``++instanceof++``

____
?

endif::env-github,rspecator-view[]
