declare namespace JSX { interface IntrinsicElements { foo: { requiredProp: string; optionalProp?: number } } } ‹foo requiredProp="bar" /›; // ok ‹foo requiredProp="bar" optionalProp={0} /›; // ok ‹foo /›; // error, requiredProp is missing ‹foo requiredProp={0} /›; // error, requiredProp should be a string ‹foo requiredProp="bar" unknownProp /›; // error, unknownProp does not exist // ok, because 'some-unknown-prop' is not a valid identifier ‹foo requiredProp="bar" some-unknown-prop /›;