A documentação ( https://angular.io/guide/template-syntax#!#star-template ) fornece o seguinte exemplo. Digamos que temos um código de modelo como este:
<hero-detail *ngIf="currentHero" [hero]="currentHero"></hero-detail>
Antes de ser processado, será "sem açúcar". Ou seja, a notação asterix será transcrita para a notação:
<template [ngIf]="currentHero">
<hero-detail [hero]="currentHero"></hero-detail>
</template>
Se 'currentHero' for verdade, isso será renderizado como
<hero-detail> [...] </hero-detail>
Mas e se você quiser uma saída condicional como esta:
<h1>Title</h1><br>
<p>text</p>
.. e você não deseja que a saída seja embrulhada em um contêiner.
Você pode escrever a versão sem açúcar diretamente assim:
<template [ngIf]="showContent">
<h1>Title</h1>
<p>text</p><br>
</template>
E isso vai funcionar bem. No entanto, agora precisamos que ngIf tenha colchetes [] em vez de um asterisco *, e isso é confuso ( https://github.com/angular/angular.io/issues/2303 )
Por esse motivo, uma notação diferente foi criada, assim:
<ng-container *ngIf="showContent"><br>
<h1>Title</h1><br>
<p>text</p><br>
</ng-container>
Ambas as versões produzirão os mesmos resultados (somente a tag h1 ep será renderizada). O segundo é o preferido, porque você pode usar * ngIf como sempre.
<template>
quando é usado sem diretivas.<template>
apenas produziria<!--template bindings={}-->
neste caso.