import Vue, { defineComponent, PropType } from '../../index'

// object props
Vue.extend({
  props: {
    foo: String,
    bar: Number
  },
  setup(props) {
    props.foo + 'foo'
    props.bar + 123
  }
})

// array props
Vue.extend({
  props: ['foo', 'bar'],
  setup(props) {
    props.foo
    props.bar
  }
})

// context
Vue.extend({
  setup(_props, ctx) {
    if (ctx.attrs.id) {
    }
    ctx.emit('foo')
    ctx.slots.default && ctx.slots.default()
    ctx.expose({
      a: 123
    })
  }
})

// object props
defineComponent({
  props: {
    foo: String,
    bar: Number
  },
  setup(props) {
    // @ts-expect-error
    props.foo.slice(1, 2)

    props.foo?.slice(1, 2)

    // @ts-expect-error
    props.bar + 123

    props.bar?.toFixed(2)
  }
})

// array props
defineComponent({
  props: ['foo', 'bar'],
  setup(props) {
    props.foo
    props.bar
  }
})

// context
defineComponent({
  emits: ['foo'],
  setup(_props, ctx) {
    if (ctx.attrs.id) {
    }
    ctx.emit('foo')
    // @ts-expect-error
    ctx.emit('ok')
    ctx.slots.default && ctx.slots.default()
  },
  methods: {
    foo() {
      this.$emit('foo')
      // @ts-expect-error
      this.$emit('bar')
    }
  }
})

defineComponent({
  props: {
    foo: null as any as PropType<{ a: number }>
  },
  data() {
    this.foo?.a
  },
  setup(props) {
    const res = props.foo?.a.toFixed(2)
    // @ts-expect-error
    res.charAt(1)
    res?.charAt(1)
  }
})

// #12568
const vm = new Vue({
  setup() {},
  render: h => h({})
})

vm.$mount('#app')