Varijabla 'test' se koristi prije nego što joj je dodijeljena vrijednost - Typescript


Dobivam pogrešku u ovoj implementaciji TypeScript koda. Ovdje mapiram jedan tip na drugi. Ali VSCode prikazuje pogrešku da je varijabla 'test' korištena prije nego što joj je dodijeljena vrijednost. Može li mi netko pomoći?

interface A {
   name: string;
   age: string;
   sex: string;
}

interface B {
   name: any;
   age: string;
   sex: string;
 }

const modifyData = (g : B) :A => {

    let test: A;
    test.name = g.name['ru'];
    test.age = g.age;
    test.sex = g.sex;

   return test as A;
};

const g = [{
  "name": {
      "en": "George",
      "ru": "Gregor"
       },
  "age": "21",
  "sex": "Male"
},
{
  "name": {
      "en": "David",
      "ru": "Diva"
       },,
  "age": "31",
  "sex": "Male"
}];

const data = g.map(modifyData);
console.log(data);

Odgovor #1

Da malo pojasnimo, ovo ovisi o razlici između „dodijeljeno“ i „definirano“. Na primjer:

let myDate: Date; // I've defined my variable as of `Date` type, but it still has no value.

if (!someVariable) {
   myDate = new Date();
}

console.log(`My date is ${myDate}`) // TS will throw an error, because, if the `if` statement doesn't run, `myDate` is defined, but not assigned (i.e., still has no actual value).
   

Definiranje jednostavno znači davanje početne vrijednosti:

let myDate: Date | undefined = undefined; // myDate is now equal to `undefined`, so whatever happens later, TS won't worry that it won't exist.

Odgovor #2

Pogreška se pokreće jer TypeScript u nekim scenarijima još uvijek vidi varijablu kao nedefiniranu. Dodavanje ! prije varijable govori TypeScriptu da ukloni undefined ili null kao moguće tipove za varijablu:

let test!: A;

Dokument o tvrdnjama o definitivnoj dodjeli

Igralište: typescript/igralište

Odgovor #3

Zaista nije dodijeljeno. Definirano je, ali nema vrijednost.

Da dam primjer

let text: string; // variable `text` gets defined, but it has no assigned value - it is defined but unassigned
if (Math.random() > 0.5) {
  text = "heads";
}
// console.log(`We flipped ${text}`) // this would be an error for the compiler as the variable text might still not have a value assigned to it
text = "tomato"; // here we finally guarantee that text will have a value assigned to it and we can safely use it as string
console.log(`We found ${text}`)


Po mom skromnom mišljenju, najsmisljeniji način bi bio vratiti literal:

const modifyData = (g: B):A => {
    return {
        name: g.name['ru'],
        age: g.age,
        sex: g.sex
    } as A;
};

Povezani članci