function* extractRuntimeProps(context, node) {
  const members = node.type === 'TSTypeLiteral' ? node.members : node.body
  for (const member of members) {
    if (
      member.type === 'TSPropertySignature' ||
      member.type === 'TSMethodSignature'
    ) {
      if (member.key.type !== 'Identifier' && member.key.type !== 'Literal') {
        yield {
          type: 'unknown',
          propName: null,
          node: /** @type {Expression} */ (member.key)
        }
        continue
      }
      /** @type {string[]|undefined} */
      let types
      if (member.type === 'TSMethodSignature') {
        types = ['Function']
      } else if (member.typeAnnotation) {
        types = inferRuntimeType(context, member.typeAnnotation.typeAnnotation)
      }
      yield {
        type: 'type',
        key: /** @type {Identifier | Literal} */ (member.key),
        propName:
          member.key.type === 'Identifier'
            ? member.key.name
            : `${member.key.value}`,
        node: /** @type {TSPropertySignature | TSMethodSignature} */ (member),

        required: !member.optional,
        types: types || [`null`]
      }
    }
  }
}
@see https://github.com/vuejs/vue-next/blob/253ca2729d808fc051215876aa4af986e4caa43c/packages/compiler-sfc/src/compileScript.ts#L1512
@param {RuleContext} context The ESLint rule context object.
@param {TSESTreeTSTypeLiteral | TSESTreeTSInterfaceBody} node
@returns {IterableIterator<ComponentTypeProp | ComponentUnknownProp>}