Solution 1: Remove the explicit type definition
Since getPerson
already returns a Person
with a name, we can use the inferred type.
function getPerson(){
let person = {name:"John"};
return person;
}
let person = getPerson();
If we were to define person: Person
we would lose a piece of information. We know getPerson
returns an object with a non-optional property called name
, but describing it as Person
would bring the optionality back.
Solution 2: Use a more precise definition
type Require<T, K extends keyof T> = T & {
[P in K]-?: T[P]
};
function getPerson() {
let person = {name:"John"};
return person;
}
let person: Require<Person, 'name'> = getPerson();
let name1:string = person.name;
Solution 3: Redesign your interface
A shape in which all properties are optional is called a weak type and usually is an indicator of bad design. If we were to make name
a required property, your problem goes away.
interface Person {
name:string,
age?:string,
gender?:string,
occupation?:string,
}