yarn create vite my-vue-app --template vue-ts
import { defineComponent } from 'vue'
export default defineComponent({
name: 'MyComponent',
props: {
message: String
},
setup(props) {
console.log(props.message)
}
})
<script setup lang="ts">
import { ref } from 'vue'
const count = ref<number>(0)
const message = ref<string>('Hello')
</script>
<script setup lang="ts">
interface Props {
message: string
count?: number
tags: string[]
callback: (id: number) => void
}
const props = defineProps<Props>()
const props = withDefaults(defineProps<Props>(), {
count: 0,
tags: () => []
})
</script>
interface User {
id: number
name: string
email: string
}
interface Props {
user: User
users: User[]
}
const props = defineProps<Props>()
<script setup lang="ts">
interface Emits {
(e: 'update', value: string): void
(e: 'delete', id: number): void
}
const emit = defineEmits<Emits>()
emit('update', 'new value')
emit('delete', 123)
</script>
import { ref, Ref } from 'vue'
const count = ref<number>(0)
const message: Ref<string> = ref('Hello')
const inputRef = ref<HTMLInputElement | null>(null)
import MyComponent from './MyComponent.vue'
const compRef = ref<InstanceType<typeof MyComponent> | null>(null)
import { reactive } from 'vue'
interface State {
count: number
message: string
}
const state = reactive<State>({
count: 0,
message: 'Hello'
})
import { ref, computed } from 'vue'
const count = ref(0)
const double = computed(() => count.value * 2)
const double = computed<number>(() => count.value * 2)
import { ref, Ref } from 'vue'
interface UseMouse {
x: Ref<number>
y: Ref<number>
}
export function useMouse(): UseMouse {
const x = ref(0)
const y = ref(0)
return { x, y }
}
<script setup lang="ts">
import { ref } from 'vue'
import MyComponent from './MyComponent.vue'
const compRef = ref<InstanceType<typeof MyComponent>>()
</script>
<template>
<MyComponent ref="compRef" />
</template>
const app = createApp(App)
app.config.globalProperties.$http = axios
declare module '@vue/runtime-core' {
interface ComponentCustomProperties {
$http: typeof axios
}
}
import { RouteRecordRaw } from 'vue-router'
const routes: RouteRecordRaw[] = [
{
path: '/',
component: Home
}
]
declare module 'vue-router' {
interface RouteMeta {
requiresAuth?: boolean
roles?: string[]
}
}
import { defineStore } from 'pinia'
interface State {
count: number
name: string
}
export const useCounterStore = defineStore('counter', {
state: (): State => ({
count: 0,
name: 'Counter'
}),
getters: {
doubleCount: (state): number => state.count * 2
},
actions: {
increment() {
this.count++
}
}
})
import { defineComponent, ref } from 'vue'
export default defineComponent({
setup() {
const count = ref(0)
return () => (
<div>
<p>{count.value}</p>
<button onClick={() => count.value++}>+1</button>
</div>
)
}
})