diff --git a/src/core/ReactCompositeComponent.js b/src/core/ReactCompositeComponent.js index ebb30c3a9e..3f9b799fca 100644 --- a/src/core/ReactCompositeComponent.js +++ b/src/core/ReactCompositeComponent.js @@ -100,7 +100,7 @@ var ReactCompositeComponentInterface = { * @type {object} * @optional */ - statics: SpecPolicy.DEFINE_MANY_MERGED, + statics: SpecPolicy.DEFINE_MANY, /** * Definition of prop types for this component. @@ -108,7 +108,7 @@ var ReactCompositeComponentInterface = { * @type {object} * @optional */ - propTypes: SpecPolicy.DEFINE_MANY_MERGED, + propTypes: SpecPolicy.DEFINE_MANY, /** * Definition of context types for this component. @@ -116,7 +116,7 @@ var ReactCompositeComponentInterface = { * @type {object} * @optional */ - contextTypes: SpecPolicy.DEFINE_MANY_MERGED, + contextTypes: SpecPolicy.DEFINE_MANY, /** * Definition of context types this component sets for its children. @@ -124,7 +124,7 @@ var ReactCompositeComponentInterface = { * @type {object} * @optional */ - childContextTypes: SpecPolicy.DEFINE_MANY_MERGED, + childContextTypes: SpecPolicy.DEFINE_MANY, // ==== Definition methods ==== @@ -337,7 +337,10 @@ var RESERVED_SPEC_KEYS = { childContextTypes, ReactPropTypeLocations.childContext ); - Constructor.childContextTypes = childContextTypes; + Constructor.childContextTypes = merge( + Constructor.childContextTypes, + childContextTypes + ); }, contextTypes: function(ConvenienceConstructor, contextTypes) { var Constructor = ConvenienceConstructor.componentConstructor; @@ -346,7 +349,7 @@ var RESERVED_SPEC_KEYS = { contextTypes, ReactPropTypeLocations.context ); - Constructor.contextTypes = contextTypes; + Constructor.contextTypes = merge(Constructor.contextTypes, contextTypes); }, propTypes: function(ConvenienceConstructor, propTypes) { var Constructor = ConvenienceConstructor.componentConstructor; @@ -355,7 +358,7 @@ var RESERVED_SPEC_KEYS = { propTypes, ReactPropTypeLocations.prop ); - Constructor.propTypes = propTypes; + Constructor.propTypes = merge(Constructor.propTypes, propTypes); }, statics: function(ConvenienceConstructor, statics) { mixStaticSpecIntoComponent(ConvenienceConstructor, statics); diff --git a/src/core/__tests__/ReactCompositeComponentMixin-test.js b/src/core/__tests__/ReactCompositeComponentMixin-test.js index 3be64ca672..5020a8c844 100644 --- a/src/core/__tests__/ReactCompositeComponentMixin-test.js +++ b/src/core/__tests__/ReactCompositeComponentMixin-test.js @@ -40,6 +40,9 @@ describe('ReactCompositeComponent-mixin', function() { componentPropValidator = mocks.getMockFunction(); var MixinA = { + propTypes: { + propA: function() {} + }, componentDidMount: function() { this.props.listener('MixinA didMount'); } @@ -47,12 +50,18 @@ describe('ReactCompositeComponent-mixin', function() { var MixinB = { mixins: [MixinA], + propTypes: { + propB: function() {} + }, componentDidMount: function() { this.props.listener('MixinB didMount'); } }; var MixinC = { + statics: { + staticC: function() {} + }, componentDidMount: function() { this.props.listener('MixinC didMount'); } @@ -66,11 +75,15 @@ describe('ReactCompositeComponent-mixin', function() { TestComponent = React.createClass({ mixins: [MixinB, MixinC, MixinD], - + statics: { + staticComponent: function() {} + }, + propTypes: { + propComponent: function() {} + }, componentDidMount: function() { this.props.listener('Component didMount'); }, - render: function() { return
; } @@ -87,6 +100,21 @@ describe('ReactCompositeComponent-mixin', function() { }); }); + it('should support merging propTypes and statics', function() { + var listener = mocks.getMockFunction(); + var instance = ; + ReactTestUtils.renderIntoDocument(instance); + + var instancePropTypes = instance.constructor.propTypes; + + expect('propA' in instancePropTypes).toBe(true); + expect('propB' in instancePropTypes).toBe(true); + expect('propComponent' in instancePropTypes).toBe(true); + + expect('staticC' in TestComponent).toBe(true); + expect('staticComponent' in TestComponent).toBe(true); + }); + it('should support chaining delegate functions', function() { var listener = mocks.getMockFunction(); var instance = ;