angular 5: templateRef.createEmbeddedView is not a function

According to angular 5 changelog:

The compiler option enableLegacyTemplate is now disabled by default as
the element was deprecated since v4. Use <ng-template>
instead.

So you should use ng-template instead of template:

<ng-template #tpl>
   <h1>ViewContainerRef</h1>
</ng-template>

Stackblitz Example

or set enableLegacyTemplate to true:

platformBrowserDynamic().bootstrapModule(AppModule, { enableLegacyTemplate: true })

Stackblitz Example

But you should know that

The option enableLegacyTemplate and the <template> element will both be removed in Angular v6.

In my case the error was due to me forgetting * (asterisk) before ngTemplateOutlet

When you reference in the *ngIf, else clause can’t be any arbitrary component, but it must be a ng-template.

For eg,

in a component where you have a source code similar to this:

<div *ngIf="myCondition ; else elseSection">
    <!-- ... -->
</div>
<div #elseSection>
    <!-- ... -->
</div>

The resulting source code should look like this:

<div *ngIf="myCondition ; else elseSection">
    <!-- ... -->
</div>
<ng-template #elseSection>
    <!-- ... -->
</ng-template>

ref : https://techoverflow.net/2018/02/17/how-to-fix-angular-typeerror-templateref-createembeddedview-is-not-a-function/