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 /›;