ΠΠΏΠΈΡΠΈΡΠ΅ ΠΎΡΠΈΠ±ΠΊΡ
ΠΠΎΠ³Π΄Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°Ρ ΡΠΈΠΏΠ° (Π·Π°ΡΠΈΡΠ° ΡΠΈΠΏΠ°), ΡΠ΅Π΄Π°ΠΊΡΠΎΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ, ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Ρ ΠΎΡΡΡΡΡΡΠ²ΡΡΡΠΈΠΌ ΠΏΠΎΠ»Π΅ΠΌ, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΏΠΎΠ»Π΅ Π΅ΡΡΡ ΠΈ ΠΊΠΎΠ΄ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΡΡΡ (Angular 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>
Π ΡΠΈΠΏΠ΅ ΡΠ·ΡΠΊΠΎΠ²ΠΎΠΉ ΡΠ»ΡΠΆΠ±Ρ (Π²ΡΠΏΠ»ΡΠ²Π°ΡΡΠ°Ρ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ° Π² vscode Π½Π°Π΄ item
Π²Π½ΡΡΡΠΈ {{ }}
ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅) ΡΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ any
ΠΡΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ Π²Π²Π΅Π΄ΠΈΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ExampleValue
ΠΡΠΎ ΡΠΎ, ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΎ Π² Π³ΡΡΠ΄ΡΡΠ΅ΠΉ ΡΠ·ΡΠΊΠΎΠ²ΠΎΠΉ ΡΠ»ΡΠΆΠ±Π΅ Ivy (ΡΠΌ. Https://github.com/angular/vscode-ng-language-service/issues/335#issuecomment-693545000), Π½ΠΎ Π½Π΅ ΡΠΎ, ΡΡΠΎ ΠΌΡ ΠΏΠ»Π°Π½ΠΈΡΡΠ΅ΠΌ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ Π΄ΠΎ ΡΡΠΎΠ³ΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΠΈΠ·-Π·Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ, ΠΏΡΠΈΡΡΡΠΈΡ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ·ΡΠΊΠΎΠ²ΠΎΠΉ ΡΠ»ΡΠΆΠ±Ρ.
ΠΠ°ΠΊ ΡΠΏΠΎΠΌΠΈΠ½Π°Π» ΠΡΠ·, ΡΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΎ Π² Π½ΠΎΠ²ΠΎΠΉ ΡΠ·ΡΠΊΠΎΠ²ΠΎΠΉ ΡΠ»ΡΠΆΠ±Π΅, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ»Π° Π²ΡΠΏΡΡΠ΅Π½Π° Π² Π²Π΅ΡΡΠΈΠΈ 11.1 Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΎΠΏΡΠΈΠΈ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΊΠ»ΡΡΠΈΡΡ Π΅Π³ΠΎ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ
ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ: