microsoft / TypeScript

TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
https://www.typescriptlang.org
Apache License 2.0
101.34k stars 12.54k forks source link

Strange warning with 'instanceof' #18276

Closed aeschli closed 7 years ago

aeschli commented 7 years ago

TypeScipt 2.5.2

Sorry, I wasn't able to extract a simplified example:

src/services/cssCompletion.ts(804,47) error TS2358: The left-hand side of an 'instanceof' expression must be of type 'any', an object type or a type parameter. link to cssCompletion.ts: 804

image

It's a new error, not reported by a previous version of typescript. Both nodes.HexColorValue(link) and nodes.Function(link) are classes that extend base class nodes.Node(link). The way I see it, the instanceof test is valid code to test the runtime types of the object.

Adding a brand field _hexColorValue : void; to nodes.HexColorValue fixes the issue, so maybe this is related to #12083. At the very least the message should be improved, but IMO the error is invalid.

ezequiel-umu commented 7 years ago

The compiler is telling you that the right part of your || operation is never happening. It may be a bug, but you should add the definitions of nodes.HexColorValue, nodes.Function and nodes.Node to be sure. Also, try to do a simplified version of the code and use text instead of images.

aeschli commented 7 years ago

@ezequiel-umu Thanks for the reply. As mentioned, I was not able to reproduce the issue with a simplified version. I added links to the source code. But the steps to reproduce are also quite simple, see the description.

ezequiel-umu commented 7 years ago

I didn't try to reproduce, but to me that looks like the problem you mentioned:

https://github.com/Microsoft/TypeScript/issues/12083

A bad decision making instanceof a structural check at compile time IMHO.