рдмрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ
рдЬрдм рдШрдЯрдХ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рдзреЗрдп (рдЯрд╛рдЗрдк рдЧрд╛рд░реНрдб) рджреЗрддрд╛ рд╣реИ, рддреЛ рд╕рдВрдкрд╛рджрдХ рдПрдХ рд▓рд╛рдкрддрд╛ рдлрд╝реАрд▓реНрдб рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╡рд╣ рдлрд╝реАрд▓реНрдб рд╣реЛ рдФрд░ рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реЛ (рдХреЛрдгреАрдп v8.2)ред
рдкреНрд░рдЬрдирди рдХрд░рдирд╛
*ngIf
рдореЗрдВ рдЯрд╛рдЗрдк рдЧрд╛рд░реНрдб рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред рдиреЗрд╕реНрдЯреЗрдб рддрддреНрд╡реЛрдВ рдореЗрдВ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдХрд┐рд╕реА рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
// my-model.model.ts
type MyModel = (MyModelA | MyModelB) & { type: 'A' | 'B' };
interface MyModelA {
fieldA: any;
}
interface MyModelB {
fieldB: any;
}
// foo.component.ts
public model: MyModel;
public isModelA(model): model is MyModelA {
return model.type === 'A';
}
// foo.component.html
md5-1956e8def7f34e35cec69338ae3e15c2
рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░
рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИред
рдЗрд╕реА рддрд░рд╣ рдЯрд╛рдЗрдк рдЧрд╛рд░реНрдб рднрд╛рд╖рд╛ рд╕реЗрд╡рд╛ рдореЗрдВ рд╕рдВрджрд░реНрднреЛрдВ рдкрд░ рдЖрд╡реЗрджрди рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рд╡реЗ рдРрд╕рд╛ рдХрд░рддреЗ рд╕рдордп рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╕рдордп рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ)
export class NgLetContext<T = any> {
// allows syntax "foo; let bar"
$implicit: T = null!;
// allows syntax "foo as bar"
ngLet: T = null!;
}
@Directive({
selector: '[ngLet]',
})
export class NgLetDirective<T> implements OnInit {
@Input()
set ngLet(value: T) {
this.context.$implicit = this.context.ngLet = value;
}
constructor(private containerRef: ViewContainerRef, private templateRef: TemplateRef<NgLetContext>) {}
private context = new NgLetContext<T>();
static ngTemplateContextGuard<T>(dir: NgLetDirective<T>, ctx: unknown): ctx is NgLetContext<T> {
return true;
}
ngOnInit() {
this.containerRef.createEmbeddedView(this.templateRef, this.context);
}
}
interface MyModel { baz: ExampleValue }
// foo.component.ts
public model: MyModel;
<div *ngLet="model.baz as item">
{{ item }}
</div>
рднрд╛рд╖рд╛ рд╕реЗрд╡рд╛ рдкреНрд░рдХрд╛рд░ рдореЗрдВ (рдХрдо рд╕реЗ рдХрдо {{ }}
рдЕрдВрджрд░ рдмрдирд╛рдордХреЛрдб рдореЗрдВ рд╣реЛрд╡рд░ рдЯреВрд▓рдЯрд┐рдк item
рдЕрдВрджрд░) any
рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╕рдордп, рдкреНрд░рдХрд╛рд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ ExampleValue
рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдЖрдЧрд╛рдореА рдЖрдЗрд╡реА-рдореВрд▓ рднрд╛рд╖рд╛ рд╕реЗрд╡рд╛ рдореЗрдВ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рджреЗрдЦреЗрдВ https://github.com/angular/vscode-ng-language-service/issues/335#issuecomment-693545000), рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рдЬрд┐рд╕рдХреА рд╣рдо рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ рд╡рд░реНрддрдорд╛рди рднрд╛рд╖рд╛ рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реАрдорд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рдкрд╣рд▓реЗ рдареАрдХ рдХрд░реЗрдВ
рдЬреИрд╕рд╛ рдХрд┐ рдЕрдпрд╛рдЬрд╝ рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕реЗ рдирдИ рднрд╛рд╖рд╛ рд╕реЗрд╡рд╛ рдореЗрдВ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдСрдкреНрдЯ-рдЗрди рдХреЗ рд░реВрдк рдореЗрдВ v11.1 рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: