March 16, 2023
vue3 + typescript로 개발을 하던 중, props에 type을 추가하고 싶었는데 예상치 못한 이슈를 마주했다. interface로 선언했는데 처음 보는 에러가 떴다.
https://github.com/vuejs/language-tools/discussions/2421
위의 글을 참고하면 모든 프로젝트에서 발생하는 것은 아닌데 tsconfig에서 아래 옵션이 켜져 있으면 발생한다고 한다.
// tsconfig
"compilerOptions": {
"composite": true
}
"declaration": true
도 같은 에러를 발생시킨다.
본문에 따르면 props는 component에서 export된 type중 하나이고, interface
가 defineProps
에 전달되면 setup
함수 내부에 들어가기 때문에 이 에러를 피하려면 hoisting이 필요하다.
+ interface Props {
+ msg: string
+ }
export default defineComponent({
setup() {
- interface Props {
- msg: string
- }
defineProps<Props>()
}
})
현재로서는, Volar에서 hoisting을 하려면 export
를 사용할 수 밖에 없는데, 이걸 사용자에게 강제하는건 별로 직관적이지 않다.
우회하는 다른 방법으로는 interface
대신 type
을 사용할 수 있다.
나는 일단 interface
를 export
해서 우회하고자 한다. type
으로 바꾸면 나중에 확장하지 못할 거 같아서.
개발자들이 이 문제를 어떻게 해결할지 궁금하다. 살포시 watch를 눌러본다.