dhruv2204
dhruv2204

Reputation: 1072

Variable 'test' is used before being assigned - Typescript

I am getting error in this implementation of typescript code. I am mapping here one type to another. But vscode shows error that variable 'test' is used before being assigned. can anyone please help?

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);

Upvotes: 97

Views: 176542

Answers (3)

mleko
mleko

Reputation: 12243

It is indeed unassigned. It is defined, but it has no value.

To give an example

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}`)


In my humble opinion, the cleanest way would be to return a literal:

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

Upvotes: 20

princekin
princekin

Reputation: 1125

The error is triggered because typescript sees the variable still as undefined in some scenarios. Adding !before variable tells typescript to remove undefined or null as possibles types for variable:

let test!: A;

Definite assignment assertions doc

Playground: typescript/playground

Upvotes: 110

Andrew
Andrew

Reputation: 5284

To clarify a little, this hinges on the difference between "assigned" and "defined." For example:

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).
   

Defining simply means giving it an initial value:

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

Upvotes: 138

Related Questions