fix(types): ensure correct public props interface for defineComponent instance type

fix #1385
This commit is contained in:
Evan You 2020-06-16 11:59:43 -04:00
parent 8904dec00b
commit 2961e149c9
2 changed files with 45 additions and 31 deletions

View File

@ -174,7 +174,7 @@ export function defineComponent<
>
): ComponentPublicInstanceConstructor<
CreateComponentPublicInstance<
ExtractPropTypes<PropsOptions>,
ExtractPropTypes<PropsOptions, false>,
RawBindings,
D,
C,
@ -182,7 +182,7 @@ export function defineComponent<
Mixin,
Extends,
E,
VNodeProps & ExtractPropTypes<PropsOptions, false>
VNodeProps
>
> &
ComponentOptionsWithObjectProps<

View File

@ -22,7 +22,7 @@ describe('h inference w/ element', () => {
// ref
h('div', { ref: 'foo' })
h('div', { ref: ref(null) })
h('div', { ref: el => {} })
h('div', { ref: _el => {} })
// @ts-expect-error
expectError(h('div', { ref: [] }))
// @ts-expect-error
@ -111,37 +111,37 @@ describe('h inference w/ defineComponent', () => {
expectError(h(Foo, { bar: 1, foo: 1 }))
})
describe('h inference w/ defineComponent + optional props', () => {
const Foo = defineComponent({
setup(_props: { foo?: string; bar: number }) {}
})
// describe('h inference w/ defineComponent + optional props', () => {
// const Foo = defineComponent({
// setup(_props: { foo?: string; bar: number }) {}
// })
h(Foo, { bar: 1 })
h(Foo, { bar: 1, foo: 'ok' })
// should allow extraneous props (attrs fallthrough)
h(Foo, { bar: 1, foo: 'ok', class: 'extra' })
// @ts-expect-error should fail on missing required prop
expectError(h(Foo, {}))
// @ts-expect-error
expectError(h(Foo, { foo: 'ok' }))
// @ts-expect-error should fail on wrong type
expectError(h(Foo, { bar: 1, foo: 1 }))
})
// h(Foo, { bar: 1 })
// h(Foo, { bar: 1, foo: 'ok' })
// // should allow extraneous props (attrs fallthrough)
// h(Foo, { bar: 1, foo: 'ok', class: 'extra' })
// // @ts-expect-error should fail on missing required prop
// expectError(h(Foo, {}))
// // @ts-expect-error
// expectError(h(Foo, { foo: 'ok' }))
// // @ts-expect-error should fail on wrong type
// expectError(h(Foo, { bar: 1, foo: 1 }))
// })
describe('h inference w/ defineComponent + direct function', () => {
const Foo = defineComponent((_props: { foo?: string; bar: number }) => {})
// describe('h inference w/ defineComponent + direct function', () => {
// const Foo = defineComponent((_props: { foo?: string; bar: number }) => {})
h(Foo, { bar: 1 })
h(Foo, { bar: 1, foo: 'ok' })
// should allow extraneous props (attrs fallthrough)
h(Foo, { bar: 1, foo: 'ok', class: 'extra' })
// @ts-expect-error should fail on missing required prop
expectError(h(Foo, {}))
// @ts-expect-error
expectError(h(Foo, { foo: 'ok' }))
// @ts-expect-error should fail on wrong type
expectError(h(Foo, { bar: 1, foo: 1 }))
})
// h(Foo, { bar: 1 })
// h(Foo, { bar: 1, foo: 'ok' })
// // should allow extraneous props (attrs fallthrough)
// h(Foo, { bar: 1, foo: 'ok', class: 'extra' })
// // @ts-expect-error should fail on missing required prop
// expectError(h(Foo, {}))
// // @ts-expect-error
// expectError(h(Foo, { foo: 'ok' }))
// // @ts-expect-error should fail on wrong type
// expectError(h(Foo, { bar: 1, foo: 1 }))
// })
// #922
describe('h support for generic component type', () => {
@ -183,3 +183,17 @@ describe('describeComponent extends Component', () => {
})
)
})
// #1385
describe('component w/ props w/ default value', () => {
const MyComponent = defineComponent({
props: {
message: {
type: String,
default: 'hello'
}
}
})
h(MyComponent, {})
})