I am using vue composition api with typescript.
How can I strongly type the component props using typescript typing system?
Troy Kessier's answer is not entirely accurate. I quote the documentation on definecomponent:
Alternatively if your component does not use any option other than setup itself, you can pass the function directly […]
So there are not two ways of declaring properties, but rather two ways of declaring a component, and each of them provides its own way of typing props.
With the classic way and TypeScript, use PropType:
import { defineComponent, PropType } from 'vue'
export default defineComponent({
props: {
someOptionalString: String,
someRequiredString: {
type: String,
required: true
},
someObject: {
type: Object as PropType<MyObjectType>,
required: true
},
},
// …
})
Notice: PropType helps to give a correct TypeScript type to the props parameter in the setup function. But the underlying Vue type for the props remains Object and there is currently no way to enforce a better typing for these props passed by the parent component.
@vue/composition-api, the PropType should instead be imported from that package, not from vue itself. Otherwise, at least for me, it’ll error everywhere.As explained in the official docs you can type props in two ways:
Define arops via argument annotation
import { defineComponent } from 'vue'
export default defineComponent((props: { foo: string }) => {
props.foo
})
Or like this
import { defineComponent } from 'vue'
export default defineComponent({
props: {
foo: String
},
setup(props) {
props.foo // <- type: string
}
})