universe.earth.type; // Property 'type' does not exist on type 'string | {type: string; parent: string;}',// Property 'type' does not exist on type 'string'
속성 값의 타입을 객체와 문자열의 유니언으로 표기했기 때문에 earth가 문자열일 수도 있다고 생각함
즉, earth 도 string | {type: string, parent: string} 타입으로 인식하게됨
추론의 이점을 누리면서 오타를 잡아내는 방법
객체 리터럴 뒤에 'satisfies' 를 표기하면 된다.
타입 추론된것을 그대로 사용하면서 각각의 속성들을 staisfies에 적은 타입으로 다시 한번 검사
: NamedCircle 타입 선언을 지우면 객체의 유효성을 검사하지 못하므로 딜레마에 빠진다
이럴 때 사용할 수 있는 것이 satisfies
typeNamedCircle= { redius:number; name?:string;}constcircle:NamedCircle= {radius:1.0, name:'woong'};// circle.name은 optional type으로 undefined일 수 있기 때문에 오류 발생console.log(circle.name.length);
typeNamedCircle= { redius:number; name?:string;}// radius가 NamedCircle을 위반하여 오류 발생constwrongCircle= {radius:'1.0', name:'woong'};satisfiesNamedCircle;/* 객체 리터럴이 NamedCircle 타입과 일치하도록 보장되며* 추론된 타입은 name 필드가 옵셔널이 아닌 필드가 된다.*/constcircle= {radius:1.0, name:'woong'};satisfiesNamedCircle;// circle.name은 undefined가 될 수 없다.console.log(circle.name.length);