Vscode-ng-language-service: Typwächter werden in verschachtelten Elementen nicht erkannt

Erstellt am 4. Aug. 2020  ·  3Kommentare  ·  Quelle: angular/vscode-ng-language-service

Beschreibe den Fehler

Wenn die Komponente eine Funktion verwendet, die ein Typprädikat (Typwächter) zurückgibt, zeigt der Editor einen Fehler im Zusammenhang mit einem fehlenden Feld an, obwohl das Feld vorhanden ist und der Code kompiliert wird (Angular v8.2).

Fortpflanzen
Verwenden Sie einen Typenschutz in *ngIf . Versuchen Sie es mit einem Feld aus der Schnittstelle, das von ihm in verschachtelten Elementen bestimmt wird.

// 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


Erwartetes Verhalten

Im Editor liegt kein Fehler vor.

bug ivy

Alle 3 Kommentare

In ähnlicher Weise gelten Typwächter nicht für Kontexte im Sprachdienst (sie scheinen beim Kompilieren genauso zu gelten)

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>

Der Typ des Sprachdienstes (mit dem Mauszeiger in vscode über item innerhalb von {{ }} bewegen) ist any

Beim Kompilieren ist der Typ korrekt ExampleValue

Dies wird im kommenden Ivy-nativen Sprachdienst behoben (siehe https://github.com/angular/vscode-ng-language-service/issues/335#issuecomment-693545000), aber nicht geplant), aufgrund der inhärenten Einschränkungen der aktuellen Sprachdienstimplementierung vorher behoben werden.

Wie Ayaz erwähnte, wird dies im neuen Sprachdienst behoben, der in v11.1 als Opt-In veröffentlicht wurde. Sie können es in den Erweiterungseinstellungen aktivieren:
image

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen