reactjs - Hvordan endre objektets verdi i typescript?


Jeg har et array med objekter, og jeg prøver bare å endre objektverdien, men jeg får feilen "Type 'string | boolean' kan ikke tildeles til typen 'never'. Type 'string' kan ikke tildeles til typen 'never'."

 interface Field {
 _id: string;
 name: string;
 title: string;
 required: boolean;
 }

 const fields: Field[] = [{ _id: "", name: "", title: "", required: 
 false }];

 function handleChangeField(
    index: number,
    key: string,
    value: string | boolean
  ) {
    fields[index][key as keyof Field] = value; //Error
  }


 handleChangeField(0, "required", true);

Svar #1

Du må gjøre funksjonen generisk på nøkkelen fordi grensesnittet ditt har mer enn én type verdi:

interface Field {
    _id: string;
    name: string;
    title: string;
    required: boolean;
}

const fields: Field[] = [{ _id: "", name: "", title: "", required: false }];

function handleChangeField<K extends keyof Field>(
    index: number,
    key: K,
    value: Field[K]
) {
    fields[index][key] = value;
}


handleChangeField(0, "required", true);

Svar #2

Typescript slutter seg til typen fra din array-deklarasjon av en tom array. For å fikse dette trenger du bare å deklarere arrayen din slik

const fields: Field[]= [];

Grunnen til at du får feilen 'cannot be assigned to never' er fordi TypeScript ikke vet om nøkkelen din er required eller andre nøkler som er av typen string.

For å fikse det kan du enten erklære typer i funksjonsparametrene dine som nevnt av @iz_

function handleChangeField<K extends keyof Field>(
    index: number,
    key: K,
    value: Field[K]
) {
    fields[index][key] = value;
}

eller du kunne også håndtere eksplisitt typetesting i funksjonen din -

 function handleChangeField(
    index: number,
    key: keyof Field,
    value: string | boolean
  ) {
      if (key === "required") {
          fields[index][key] = (value as boolean);
      } else {
          fields[index][key] = (value as string);
      }
  }

Relaterte artikler