Downcasting is not cheap and may produce app termination. Much better to use explicit type narrowing + implicit downcasting like: ```ts class Animal {} class Tiger extends Animal {} ``` ```ts function foo(base: Animal): void { if (base instanceof Tiger) { let tiger = base; // implicitly infer as base: Tiger // use tiger } } ``` instead of ```ts function foo(base: Animal): void { let tiger = <Tiger>base; // may throw "unexpected downcast" } ``` Pedantic mode (enabled by `--pedantic`) should disallow last explicit variant and propose first one. Depends on #2423 and #2352