props 和 emit 推荐定义方式 
使用 defineProps | defineEmits 的 ts 类型方式定义更加灵活,类型提示更加丰富
vue
<script setup lang="ts">
const props = withDefaults(
  defineProps<{
    value: string; // 必传字符串参数
    title?: string; // 可选字符串参数
    array?: string[]; // 可选数组参数
    showClose?: boolean; // 可选布尔参数
  }>(),
  {
    title: '', // 配置默认值
    array: () => []
  }
);
const emit = defineEmits<{
  (e: 'update:value', v: string): void;
  (e: 'update:array', v: string[]): void;
  (e: 'submit', v: string): void;
}>();
</script>vue
<script setup lang="ts">
// 不建议使用此方式,书写麻烦,类型提示不友好
import { PropType } from 'vue';
const props = defineProps({
  value: { type: String, required: true },
  title: { type: String, default: '' },
  array: { type: Array as PropType<string[]>, default: () => [] },
  showClose: { type: Boolean }
});
const emit = defineEmits(['update:value', 'update:array', 'submit']);
</script>TIP
withDefaults 设置 props 默认值
TIP
父级在使用此组件传 props 时会有类型提示和限制,此组件 emit 事件时也会有类型提示和限制