Skip to content

Commit 1566f37

Browse files
committed
fix(compiler-sfc): fix missing ReadonlyArray, ReadonlySet, ReadonlyMap and UnknownType
1 parent 6d066dd commit 1566f37

File tree

4 files changed

+54
-6
lines changed

4 files changed

+54
-6
lines changed

packages/compiler-sfc/__tests__/compileScript/__snapshots__/defineModel.spec.ts.snap

+20
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,26 @@ return { modelValue }
123123
})"
124124
`;
125125

126+
exports[`defineModel() > w/ ReadonlyArray, ReadonlySet, ReadonlyMap and UnknownType 1`] = `
127+
"import { useModel as _useModel, defineComponent as _defineComponent } from 'vue'
128+
129+
export default /*#__PURE__*/_defineComponent({
130+
props: {
131+
"modelValue": { type: [String, ReadonlyArray, ReadonlySet, ReadonlyMap], skipCheck: true },
132+
"modelModifiers": {},
133+
},
134+
emits: ["update:modelValue"],
135+
setup(__props, { expose: __expose }) {
136+
__expose();
137+
138+
const modelValue = _useModel<UnknownType | string | ReadonlyArray<string> | ReadonlySet<string> | ReadonlyMap<string, number>>(__props, "modelValue")
139+
140+
return { modelValue }
141+
}
142+
143+
})"
144+
`;
145+
126146
exports[`defineModel() > w/ array props 1`] = `
127147
"import { useModel as _useModel, mergeModels as _mergeModels } from 'vue'
128148

packages/compiler-sfc/__tests__/compileScript/defineModel.spec.ts

+20
Original file line numberDiff line numberDiff line change
@@ -241,4 +241,24 @@ describe('defineModel()', () => {
241241
modelValue: BindingTypes.SETUP_REF,
242242
})
243243
})
244+
245+
test('w/ ReadonlyArray, ReadonlySet, ReadonlyMap and UnknownType', () => {
246+
const { content, bindings } = compile(
247+
`
248+
<script setup lang="ts">
249+
const modelValue = defineModel<UnknownType | string | ReadonlyArray<string> | ReadonlySet<string> | ReadonlyMap<string, number>>()
250+
</script>
251+
`,
252+
)
253+
assertCode(content)
254+
expect(content).toMatch(
255+
' "modelValue": { type: [String, ReadonlyArray, ReadonlySet, ReadonlyMap], skipCheck: true }',
256+
)
257+
expect(content).toMatch(
258+
`const modelValue = _useModel<UnknownType | string | ReadonlyArray<string> | ReadonlySet<string> | ReadonlyMap<string, number>>(__props, "modelValue")`,
259+
)
260+
expect(bindings).toStrictEqual({
261+
modelValue: BindingTypes.SETUP_REF,
262+
})
263+
})
244264
})

packages/compiler-sfc/src/script/defineModel.ts

+11-6
Original file line numberDiff line numberDiff line change
@@ -133,12 +133,17 @@ export function genModelProps(ctx: ScriptCompileContext) {
133133
const hasUnknownType = runtimeTypes.includes(UNKNOWN_TYPE)
134134

135135
if (isProd || hasUnknownType) {
136-
runtimeTypes = runtimeTypes.filter(
137-
t =>
138-
t === 'Boolean' ||
139-
(hasBoolean && t === 'String') ||
140-
(t === 'Function' && options),
141-
)
136+
runtimeTypes = runtimeTypes.filter(t => {
137+
if (isProd) {
138+
return (
139+
t === 'Boolean' ||
140+
(hasBoolean && t === 'String') ||
141+
(t === 'Function' && options)
142+
)
143+
}
144+
145+
return t !== UNKNOWN_TYPE
146+
})
142147

143148
skipCheck = !isProd && hasUnknownType && runtimeTypes.length > 0
144149
}

packages/compiler-sfc/src/script/resolveType.ts

+3
Original file line numberDiff line numberDiff line change
@@ -1517,10 +1517,13 @@ export function inferRuntimeType(
15171517
if (node.typeName.type === 'Identifier') {
15181518
switch (node.typeName.name) {
15191519
case 'Array':
1520+
case 'ReadonlyArray':
15201521
case 'Function':
15211522
case 'Object':
15221523
case 'Set':
1524+
case 'ReadonlySet':
15231525
case 'Map':
1526+
case 'ReadonlyMap':
15241527
case 'WeakSet':
15251528
case 'WeakMap':
15261529
case 'Date':

0 commit comments

Comments
 (0)