Skip to content

Commit

Permalink
fix(compiler-sfc): support using declared interface in normal script …
Browse files Browse the repository at this point in the history
…with defineProps() (#4522)

fix #4423
  • Loading branch information
edison1105 committed Sep 5, 2021
1 parent 5594643 commit 14d6518
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 3 deletions.
Expand Up @@ -866,6 +866,26 @@ export default /*#__PURE__*/_defineComponent({
return { }
}
})"
`;
exports[`SFC compile <script setup> with TypeScript defineProps w/ exported interface in normal script 1`] = `
"import { defineComponent as _defineComponent } from 'vue'
export interface Props { x?: number }
export default /*#__PURE__*/_defineComponent({
props: {
x: { type: Number, required: false }
},
setup(__props: any, { expose }) {
expose()
return { }
}
Expand Down
16 changes: 16 additions & 0 deletions packages/compiler-sfc/__tests__/compileScript.spec.ts
Expand Up @@ -784,6 +784,22 @@ const emit = defineEmits(['a', 'b'])
})
})

test('defineProps w/ exported interface in normal script', () => {
const { content, bindings } = compile(`
<script lang="ts">
export interface Props { x?: number }
</script>
<script setup lang="ts">
defineProps<Props>()
</script>
`)
assertCode(content)
expect(content).toMatch(`x: { type: Number, required: false }`)
expect(bindings).toStrictEqual({
x: BindingTypes.PROPS
})
})

test('defineProps w/ type alias', () => {
const { content, bindings } = compile(`
<script setup lang="ts">
Expand Down
8 changes: 5 additions & 3 deletions packages/compiler-sfc/src/compileScript.ts
Expand Up @@ -467,8 +467,10 @@ export function compileScript(
return isQualifiedType(node.declaration)
}
}

for (const node of scriptSetupAst.body) {
const body = scriptAst
? [...scriptSetupAst.body, ...scriptAst.body]
: scriptSetupAst.body
for (const node of body) {
const qualified = isQualifiedType(node)
if (qualified) {
return qualified
Expand Down Expand Up @@ -635,7 +637,7 @@ export function compileScript(
}

// 1. process normal <script> first if it exists
let scriptAst
let scriptAst: Program | undefined
if (script) {
// import dedupe between <script> and <script setup>
scriptAst = parse(
Expand Down

0 comments on commit 14d6518

Please sign in to comment.