https://vuejs.org/guide/typescript/composition-api.html#typing-reactive
ref
import { ref } from 'vue'// inferred type: Ref<number>const year = ref(2020)// => TS Error: Type 'string' is not assignable to type 'number'.year.value = '2020'
reactive
import { reactive } from 'vue'interface Book {title: stringyear?: number}const book: Book = reactive({ title: 'Vue 3 Guide' })
computed
import { ref, computed } from 'vue'const count = ref(0)// inferred type: ComputedRef<number>const double = computed(() => count.value * 2)// => TS Error: Property 'split' does not exist on type 'number'const result = double.value.split('')
refs
<script setup lang="ts">import { ref, onMounted } from 'vue'const el = ref<HTMLInputElement | null>(null)onMounted(() => {el.value?.focus()})</script><template><input ref="el" /></template>
props
<script setup lang="ts">interface Props {foo: stringbar?: number}// reactive destructure for defineProps()// default value is compiled to equivalent runtime optionconst { foo, bar = 100 } = defineProps<Props>()</script>
<script setup lang="ts">const props = defineProps({foo: { type: String, required: true },bar: Number})props.foo // stringprops.bar // number | undefined</script>
emit
<script setup lang="ts">// runtimeconst emit = defineEmits(['change', 'update'])// type-basedconst emit = defineEmits<{(e: 'change', id: number): void(e: 'update', value: string): void}>()</script>
