alias: { type: Array, required: true },
method: { type: Function, required: true },
symbol: { type: Symbol, required: true },
+ objectOrFn: { type: [Function, Object], required: true },
union: { type: [String, Number], required: true },
literalUnion: { type: String, required: true },
literalUnionNumber: { type: Number, required: true },
alias: Alias
method(): void
symbol: symbol
+ objectOrFn: {
+ (): void
+ foo: string
+ }
union: string | number
literalUnion: 'foo' | 'bar'
expect(content).toMatch(`alias: { type: Array, required: true }`)
expect(content).toMatch(`method: { type: Function, required: true }`)
expect(content).toMatch(`symbol: { type: Symbol, required: true }`)
+ expect(content).toMatch(
+ `objectOrFn: { type: [Function, Object], required: true },`
+ )
expect(content).toMatch(
`union: { type: [String, Number], required: true }`
)
alias: BindingTypes.PROPS,
method: BindingTypes.PROPS,
symbol: BindingTypes.PROPS,
+ objectOrFn: BindingTypes.PROPS,
union: BindingTypes.PROPS,
literalUnion: BindingTypes.PROPS,
literalUnionNumber: BindingTypes.PROPS,
return ['Boolean']
case 'TSObjectKeyword':
return ['Object']
- case 'TSTypeLiteral':
+ case 'TSTypeLiteral': {
// TODO (nice to have) generate runtime property validation
- return ['Object']
+ const types = new Set<string>()
+ for (const m of node.members) {
+ switch (m.type) {
+ case 'TSCallSignatureDeclaration':
+ case 'TSConstructSignatureDeclaration':
+ types.add('Function')
+ break
+ default:
+ types.add('Object')
+ }
+ }
+ return Array.from(types)
+ }
case 'TSFunctionType':
return ['Function']
case 'TSArrayType':