Here's a quick way to get what is happening:
When you did the following:
name? : string
You were saying to TypeScript it was optional. Nevertheless, when you did:
let name1 : string = person.name; //<<<Error here
You did not leave it a choice. You needed to have a Union on it reflecting the undefined type:
let name1 : string | undefined = person.name; //<<<No error here
Using your answer, I was able to sketch out the following which is basically, an Interface, a Class and an Object. I find this approach simpler, never mind if you don't.
// Interface interface iPerson { fname? : string, age? : number, gender? : string, occupation? : string, get_person?: any } // Class Object class Person implements iPerson { fname? : string; age? : number; gender? : string; occupation? : string; get_person?: any = function () { return this.fname; } } // Object literal const person1 : Person = { fname : 'Steve', age : 8, gender : 'Male', occupation : 'IT' } const p_name: string | undefined = person1.fname; // Object instance const person2: Person = new Person(); person2.fname = 'Steve'; person2.age = 8; person2.gender = 'Male'; person2.occupation = 'IT'; // Accessing the object literal (person1) and instance (person2) console.log('person1 : ', p_name); console.log('person2 : ', person2.get_person());
??
,let name1: string = person.name ?? "";
it returns the right side if the value is null or undefined