diff --git a/lib/rules/prop-types.js b/lib/rules/prop-types.js index 6d2d57aad7..17809767a5 100644 --- a/lib/rules/prop-types.js +++ b/lib/rules/prop-types.js @@ -480,13 +480,23 @@ module.exports = { } return true; case 'ObjectTypeAnnotation': + let containsObjectTypeSpread = false; var shapeTypeDefinition = { type: 'shape', children: {} }; iterateProperties(annotation.properties, function(childKey, childValue) { - shapeTypeDefinition.children[childKey] = buildTypeAnnotationDeclarationTypes(childValue); + if (!childKey && !childValue) { + containsObjectTypeSpread = true; + } else { + shapeTypeDefinition.children[childKey] = buildTypeAnnotationDeclarationTypes(childValue); + } }); + + // nested object type spread means we need to ignore/accept everything in this object + if (containsObjectTypeSpread) { + return true; + } return shapeTypeDefinition; case 'UnionTypeAnnotation': var unionTypeDefinition = { diff --git a/tests/lib/rules/prop-types.js b/tests/lib/rules/prop-types.js index 7feadfb2ea..95194d938c 100644 --- a/tests/lib/rules/prop-types.js +++ b/tests/lib/rules/prop-types.js @@ -1414,6 +1414,67 @@ ruleTester.run('prop-types', rule, { '}' ].join('\n'), parser: 'babel-eslint' + }, { + code: [ + 'type Person = {', + ' ...$Exact,', + ' lastname: string', + '};', + 'class Hello extends React.Component {', + ' props: Person;', + ' render () {', + ' return
Hello {this.props.firstname}
;', + ' }', + '}' + ].join('\n'), + parser: 'babel-eslint' + }, { + code: [ + 'import type {Data} from \'./Data\'', + 'type Person = {', + ' ...Data,', + ' lastname: string', + '};', + 'class Hello extends React.Component {', + ' props: Person;', + ' render () {', + ' return
Hello {this.props.bar}
;', + ' }', + '}' + ].join('\n'), + parser: 'babel-eslint' + }, { + code: [ + 'import type {Data} from \'some-libdef-like-flow-typed-provides\'', + 'type Person = {', + ' ...Data,', + ' lastname: string', + '};', + 'class Hello extends React.Component {', + ' props: Person;', + ' render () {', + ' return
Hello {this.props.bar}
;', + ' }', + '}' + ].join('\n'), + parser: 'babel-eslint' + }, { + code: [ + 'import type {BasePerson} from \'./types\'', + 'type Props = {', + ' person: {', + ' ...$Exact,', + ' lastname: string', + ' }', + '};', + 'class Hello extends React.Component {', + ' props: Props;', + ' render () {', + ' return
Hello {this.props.person.firstname}
;', + ' }', + '}' + ].join('\n'), + parser: 'babel-eslint' }, { code: [ 'type Person = {',