symbol: { type: Symbol, required: true },
extract: { type: Number, 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 },
union: { type: [String, Number], required: true },
literalUnion: { type: String, required: true },
-// Vitest Snapshot v1
+// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
exports[`sfc hoist static > should enable when only script setup 1`] = `
"const foo = 'bar'
symbol: symbol
extract: Extract<1 | 2 | boolean, 2>
exclude: Exclude<1 | 2 | boolean, 2>
+ uppercase: Uppercase<'foo'>
+ params: Parameters<(foo: any) => void>
+ nonNull: NonNullable<string | null>
objectOrFn: {
(): void
foo: string
expect(content).toMatch(
`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(
`union: { type: [String, Number], required: true }`
)
literalUnionMixed: BindingTypes.PROPS,
intersection: BindingTypes.PROPS,
intersection2: BindingTypes.PROPS,
- foo: BindingTypes.PROPS
+ foo: BindingTypes.PROPS,
+ uppercase: BindingTypes.PROPS,
+ params: BindingTypes.PROPS,
+ nonNull: BindingTypes.PROPS
})
})
case 'Date':
case 'Promise':
return [node.typeName.name]
- case 'Record':
+
+ // TS built-in utility types
+ // https://www.typescriptlang.org/docs/handbook/utility-types.html
case 'Partial':
+ case 'Required':
case 'Readonly':
+ case 'Record':
case 'Pick':
case 'Omit':
- case 'Required':
case 'InstanceType':
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':
if (node.typeParameters && node.typeParameters.params[1]) {
return inferRuntimeType(
declaredTypes
)
}
- return ['null']
case 'Exclude':
+ case 'OmitThisParameter':
if (node.typeParameters && node.typeParameters.params[0]) {
return inferRuntimeType(
node.typeParameters.params[0],
declaredTypes
)
}
- return ['null']
+ // cannot infer, fallback to null: ThisParameterType
}
}
return [`null`]