=== tests/cases/compiler/spreadOfObjectLiteralAssignableToIndexSignature.ts === const foo: Record = {} // OK >foo : Record >{} : {} interface RecordOfRecords extends Record {} const recordOfRecords: RecordOfRecords = {} >recordOfRecords : RecordOfRecords >{} : {} recordOfRecords.propA = {...(foo !== undefined ? {foo} : {})} // OK >recordOfRecords.propA = {...(foo !== undefined ? {foo} : {})} : { foo?: Record | undefined; } >recordOfRecords.propA : RecordOfRecords >recordOfRecords : RecordOfRecords >propA : RecordOfRecords >{...(foo !== undefined ? {foo} : {})} : { foo?: Record | undefined; } >(foo !== undefined ? {foo} : {}) : { foo: Record; } | {} >foo !== undefined ? {foo} : {} : { foo: Record; } | {} >foo !== undefined : boolean >foo : Record >undefined : undefined >{foo} : { foo: Record; } >foo : Record >{} : {} recordOfRecords.propB = {...(foo && {foo})} // OK >recordOfRecords.propB = {...(foo && {foo})} : { foo: Record; } >recordOfRecords.propB : RecordOfRecords >recordOfRecords : RecordOfRecords >propB : RecordOfRecords >{...(foo && {foo})} : { foo: Record; } >(foo && {foo}) : { foo: Record; } >foo && {foo} : { foo: Record; } >foo : Record >{foo} : { foo: Record; } >foo : Record recordOfRecords.propC = {...(foo !== undefined && {foo})} // error'd in 3.7 beta, should be OK >recordOfRecords.propC = {...(foo !== undefined && {foo})} : { foo?: Record | undefined; } >recordOfRecords.propC : RecordOfRecords >recordOfRecords : RecordOfRecords >propC : RecordOfRecords >{...(foo !== undefined && {foo})} : { foo?: Record | undefined; } >(foo !== undefined && {foo}) : false | { foo: Record; } >foo !== undefined && {foo} : false | { foo: Record; } >foo !== undefined : boolean >foo : Record >undefined : undefined >{foo} : { foo: Record; } >foo : Record interface RecordOfRecordsOrEmpty extends Record {} const recordsOfRecordsOrEmpty: RecordOfRecordsOrEmpty = {} >recordsOfRecordsOrEmpty : RecordOfRecordsOrEmpty >{} : {} recordsOfRecordsOrEmpty.propA = {...(foo !== undefined ? {foo} : {})} // OK >recordsOfRecordsOrEmpty.propA = {...(foo !== undefined ? {foo} : {})} : { foo?: Record | undefined; } >recordsOfRecordsOrEmpty.propA : {} | RecordOfRecordsOrEmpty >recordsOfRecordsOrEmpty : RecordOfRecordsOrEmpty >propA : {} | RecordOfRecordsOrEmpty >{...(foo !== undefined ? {foo} : {})} : { foo?: Record | undefined; } >(foo !== undefined ? {foo} : {}) : { foo: Record; } | {} >foo !== undefined ? {foo} : {} : { foo: Record; } | {} >foo !== undefined : boolean >foo : Record >undefined : undefined >{foo} : { foo: Record; } >foo : Record >{} : {} recordsOfRecordsOrEmpty.propB = {...(foo && {foo})} // OK >recordsOfRecordsOrEmpty.propB = {...(foo && {foo})} : { foo: Record; } >recordsOfRecordsOrEmpty.propB : {} | RecordOfRecordsOrEmpty >recordsOfRecordsOrEmpty : RecordOfRecordsOrEmpty >propB : {} | RecordOfRecordsOrEmpty >{...(foo && {foo})} : { foo: Record; } >(foo && {foo}) : { foo: Record; } >foo && {foo} : { foo: Record; } >foo : Record >{foo} : { foo: Record; } >foo : Record recordsOfRecordsOrEmpty.propC = {...(foo !== undefined && {foo})} // OK >recordsOfRecordsOrEmpty.propC = {...(foo !== undefined && {foo})} : { foo?: Record | undefined; } >recordsOfRecordsOrEmpty.propC : {} | RecordOfRecordsOrEmpty >recordsOfRecordsOrEmpty : RecordOfRecordsOrEmpty >propC : {} | RecordOfRecordsOrEmpty >{...(foo !== undefined && {foo})} : { foo?: Record | undefined; } >(foo !== undefined && {foo}) : false | { foo: Record; } >foo !== undefined && {foo} : false | { foo: Record; } >foo !== undefined : boolean >foo : Record >undefined : undefined >{foo} : { foo: Record; } >foo : Record