code: def testOpProperty_ComplexTypeCheck(self):
      class CustomOp(resolver_op.ResolverOp):
          optional_mapping = resolver_op.Property(
              type=Optional[Mapping[str, str]], default=None
          )
  
          def apply(self, input_dict):
              return input_dict
  
      # No errors for Optional[Mapping]
      CustomOp.create()
      CustomOp.create(optional_mapping=None)
      CustomOp.create(optional_mapping={"hello": "world"})
      # Errors for non Optional[Mapping]
      with self.assertRaises(TypeError):
          CustomOp.create(optional_mapping="meh")
      with self.assertRaises(TypeError):
          CustomOp.create(optional_mapping=[])
  
imports: import copy
  from typing import Optional, Mapping, Set
  import tensorflow
  from tfx.dsl.input_resolution import resolver_op
  import tfx.types
  from tfx.types import standard_artifacts
label_desc: Use image node_id 16 for calling the ResolverOpTest obj's underlying member method code with example usage: obj.testOpProperty_ComplexTypeCheck() and returns: input_dict