console . log ( `interfaces.ts` ) ; interface IIdName { id : number ; name : string ; } let idObject = { id : 2 , name : "this is a name" } ; interface IOptional { id : number ; name ? : string ; } let optionalId = { id : 1 } ; let optionalIdName = { id : 2 , name : "optional name" } ; interface IWeakType { id ? : number ; name ? : string ; } let weakTypeNoOverlap = { name : "a name" } ; interface IIdName { id : number ; name : string ; } interface IDescrValue { descr : string ; value : number ; } function printNameOrValue ( obj ) { if ( 'id' in obj ) { console . log ( `obj.name : ${ obj . name }` ) ; } if ( 'descr' in obj ) { console . log ( `obj.value : ${ obj . value }` ) ; } } printNameOrValue ( { id : 1 , name : "nameValue" } ) ; printNameOrValue ( { descr : "description" , value : 2 } ) ; interface IPerson { id : number ; name : string ; } type PersonPropertyName = keyof IPerson ; type PersonPropertyLiteral = "id" | "name" ; function getProperty ( key , value ) { console . log ( `${ key } = ${ value [ key ] }` ) ; } getProperty ( "id" , { id : 1 , name : "firstName" } ) ; getProperty ( "name" , { id : 2 , name : "secondName" } ) ;