angular - Egenskapen har ingen initialverdi og er ikke definitivt tilordnet i konstruktøren


Jeg får en feil når jeg gir

export class UserComponent implements OnInit {
    user: User;

    constructor() { }

    ngOnInit() {
        this.user = {
            firstName : "test",
            lastName : "test",
            age : 40,
            address: {
                street : "Test",
                city : "test",
                state: "test"
            }
        }
    }
}

Jeg får denne feilen (se bilde 1):

Property 'user' has no initializer and is not definitely assigned in the constructor.

user blir instantiert fra User som er deklarert i User.ts av denne koden:

export interface User {
    firstName: string,
    lastName: string,
    age?: number,
    address?: {
        street?: string,
        city?: string,
        state?: string
    }
}

Hvis jeg legger til et spørsmålstegn (?) til user, dukker en annen feil opp i en annen fil (se bilde 2):

Error occurs in the template of component UserComponent.
src/app/components/users/users.component.html:2:44 -
    error TS2532: Object is possibly 'undefined'.

2 <ul class="list-unstyled" *ngIf="loaded && users?.length > 0">
                                             ~~~~~~~~~~~~~~~~~

Svar #1

Dette skyldes TypeScripts strenge klasseinitialisering.

https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#strict-class-initialization

For å løse dette problemet må du enten erklære at typen kan være både Foo|undefined, eller bruke '!' symbolet for å indikere definitiv tildeling som beskrevet i dokumentasjonen ovenfor:

Sak 1:

@Component({...})
export class Component {
  @Input() myInput: string|undefined;
}

Vi indikerer at typen kan være enten en streng eller udefinert.

Sak 2:

@Component({...})
export class Component {
  @Input() myInput!: string;
}

I dette tilfellet bruker vi !-symbolet for å indikere at vi er klar over at myInput ikke er initialisert i konstruktøren, og at vi vil håndtere det et annet sted.

Alternativ løsning

Hvis du ikke bryr deg om streng klasseinitialisering, kan du deaktivere funksjonen helt i din tsconfig.json ved å legge til et flagg i dine kompilatoralternativer

{
 "compilerOptions": {
    "strictPropertyInitialization": false
  }
}

Merk: Du må starte TypeScript-serveren på nytt for at compilerOptions skal brukes på nytt. Den enkleste måten å gjøre dette på er å ganske enkelt starte IDE-en din på nytt.

Svar #2

Hvis ingen av disse fungerer, kan du prøve det

  "angularCompilerOptions": {
    ....
    "strictPropertyInitialization": false,
    ...

  }

Relaterte artikler