Skip to content

Commit

Permalink
fix(types): add a type-only differentiator to assist Mixin's type inf…
Browse files Browse the repository at this point in the history
…er (#3481)

fix #3468
  • Loading branch information
HcySunYang authored Mar 29, 2021
1 parent c61e767 commit 5db2b14
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 0 deletions.
10 changes: 10 additions & 0 deletions packages/runtime-core/src/componentOptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,16 @@ interface LegacyOptions<

// runtime compile only
delimiters?: [string, string]

/**
* #3468
*
* type-only, used to assist Mixin's type inference,
* typescript will try to simplify the inferred `Mixin` type,
* with the `__differenciator`, typescript won't be able to combine different mixins,
* because the `__differenciator` will be different
*/
__differentiator?: keyof D | keyof C | keyof M
}

export type OptionTypesKeys = 'P' | 'B' | 'D' | 'C' | 'M' | 'Defaults'
Expand Down
35 changes: 35 additions & 0 deletions test-dts/defineComponent.test-d.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -775,6 +775,41 @@ describe('extends with mixins', () => {
expectError(<MyComponent p2={'wrong type'} z={'z'} />)
// @ts-expect-error
expectError(<MyComponent mP1={3} />)

// #3468
const CompWithD = defineComponent({
data() {
return { foo: 1 }
}
})
const CompWithC = defineComponent({
computed: {
foo() {
return 1
}
}
})
const CompWithM = defineComponent({ methods: { foo() {} } })
const CompEmpty = defineComponent({})

defineComponent({
mixins: [CompWithD, CompEmpty],
mounted() {
expectType<number>(this.foo)
}
})
defineComponent({
mixins: [CompWithC, CompEmpty],
mounted() {
expectType<number>(this.foo)
}
})
defineComponent({
mixins: [CompWithM, CompEmpty],
mounted() {
expectType<() => void>(this.foo)
}
})
})

describe('compatibility w/ createApp', () => {
Expand Down

0 comments on commit 5db2b14

Please sign in to comment.