mirror of https://github.com/vuejs/core.git
fix(compiler-sfc): handle more TS built-in utilities in defineProps inference
This commit is contained in:
parent
151a8ad6b9
commit
4355d2492d
|
@ -1637,6 +1637,9 @@ export default /*#__PURE__*/_defineComponent({
|
||||||
symbol: { type: Symbol, required: true },
|
symbol: { type: Symbol, required: true },
|
||||||
extract: { type: Number, required: true },
|
extract: { type: Number, required: true },
|
||||||
exclude: { type: [Number, Boolean], required: true },
|
exclude: { type: [Number, Boolean], required: true },
|
||||||
|
uppercase: { type: String, required: true },
|
||||||
|
params: { type: Array, required: true },
|
||||||
|
nonNull: { type: String, required: true },
|
||||||
objectOrFn: { type: [Function, Object], required: true },
|
objectOrFn: { type: [Function, Object], required: true },
|
||||||
union: { type: [String, Number], required: true },
|
union: { type: [String, Number], required: true },
|
||||||
literalUnion: { type: String, required: true },
|
literalUnion: { type: String, required: true },
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Vitest Snapshot v1
|
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
||||||
|
|
||||||
exports[`sfc hoist static > should enable when only script setup 1`] = `
|
exports[`sfc hoist static > should enable when only script setup 1`] = `
|
||||||
"const foo = 'bar'
|
"const foo = 'bar'
|
||||||
|
|
|
@ -962,6 +962,9 @@ const emit = defineEmits(['a', 'b'])
|
||||||
symbol: symbol
|
symbol: symbol
|
||||||
extract: Extract<1 | 2 | boolean, 2>
|
extract: Extract<1 | 2 | boolean, 2>
|
||||||
exclude: Exclude<1 | 2 | boolean, 2>
|
exclude: Exclude<1 | 2 | boolean, 2>
|
||||||
|
uppercase: Uppercase<'foo'>
|
||||||
|
params: Parameters<(foo: any) => void>
|
||||||
|
nonNull: NonNullable<string | null>
|
||||||
objectOrFn: {
|
objectOrFn: {
|
||||||
(): void
|
(): void
|
||||||
foo: string
|
foo: string
|
||||||
|
@ -1004,6 +1007,9 @@ const emit = defineEmits(['a', 'b'])
|
||||||
expect(content).toMatch(
|
expect(content).toMatch(
|
||||||
`exclude: { type: [Number, Boolean], required: true }`
|
`exclude: { type: [Number, Boolean], required: true }`
|
||||||
)
|
)
|
||||||
|
expect(content).toMatch(`uppercase: { type: String, required: true }`)
|
||||||
|
expect(content).toMatch(`params: { type: Array, required: true }`)
|
||||||
|
expect(content).toMatch(`nonNull: { type: String, required: true }`)
|
||||||
expect(content).toMatch(
|
expect(content).toMatch(
|
||||||
`union: { type: [String, Number], required: true }`
|
`union: { type: [String, Number], required: true }`
|
||||||
)
|
)
|
||||||
|
@ -1047,7 +1053,10 @@ const emit = defineEmits(['a', 'b'])
|
||||||
literalUnionMixed: BindingTypes.PROPS,
|
literalUnionMixed: BindingTypes.PROPS,
|
||||||
intersection: BindingTypes.PROPS,
|
intersection: BindingTypes.PROPS,
|
||||||
intersection2: BindingTypes.PROPS,
|
intersection2: BindingTypes.PROPS,
|
||||||
foo: BindingTypes.PROPS
|
foo: BindingTypes.PROPS,
|
||||||
|
uppercase: BindingTypes.PROPS,
|
||||||
|
params: BindingTypes.PROPS,
|
||||||
|
nonNull: BindingTypes.PROPS
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -2056,15 +2056,35 @@ function inferRuntimeType(
|
||||||
case 'Date':
|
case 'Date':
|
||||||
case 'Promise':
|
case 'Promise':
|
||||||
return [node.typeName.name]
|
return [node.typeName.name]
|
||||||
case 'Record':
|
|
||||||
|
// TS built-in utility types
|
||||||
|
// https://www.typescriptlang.org/docs/handbook/utility-types.html
|
||||||
case 'Partial':
|
case 'Partial':
|
||||||
|
case 'Required':
|
||||||
case 'Readonly':
|
case 'Readonly':
|
||||||
|
case 'Record':
|
||||||
case 'Pick':
|
case 'Pick':
|
||||||
case 'Omit':
|
case 'Omit':
|
||||||
case 'Required':
|
|
||||||
case 'InstanceType':
|
case 'InstanceType':
|
||||||
return ['Object']
|
return ['Object']
|
||||||
|
|
||||||
|
case 'Uppercase':
|
||||||
|
case 'Lowercase':
|
||||||
|
case 'Capitalize':
|
||||||
|
case 'Uncapitalize':
|
||||||
|
return ['String']
|
||||||
|
|
||||||
|
case 'Parameters':
|
||||||
|
case 'ConstructorParameters':
|
||||||
|
return ['Array']
|
||||||
|
|
||||||
|
case 'NonNullable':
|
||||||
|
if (node.typeParameters && node.typeParameters.params[0]) {
|
||||||
|
return inferRuntimeType(
|
||||||
|
node.typeParameters.params[0],
|
||||||
|
declaredTypes
|
||||||
|
).filter(t => t !== 'null')
|
||||||
|
}
|
||||||
case 'Extract':
|
case 'Extract':
|
||||||
if (node.typeParameters && node.typeParameters.params[1]) {
|
if (node.typeParameters && node.typeParameters.params[1]) {
|
||||||
return inferRuntimeType(
|
return inferRuntimeType(
|
||||||
|
@ -2072,15 +2092,15 @@ function inferRuntimeType(
|
||||||
declaredTypes
|
declaredTypes
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
return ['null']
|
|
||||||
case 'Exclude':
|
case 'Exclude':
|
||||||
|
case 'OmitThisParameter':
|
||||||
if (node.typeParameters && node.typeParameters.params[0]) {
|
if (node.typeParameters && node.typeParameters.params[0]) {
|
||||||
return inferRuntimeType(
|
return inferRuntimeType(
|
||||||
node.typeParameters.params[0],
|
node.typeParameters.params[0],
|
||||||
declaredTypes
|
declaredTypes
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
return ['null']
|
// cannot infer, fallback to null: ThisParameterType
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return [`null`]
|
return [`null`]
|
||||||
|
|
Loading…
Reference in New Issue