@@ -15,7 +15,7 @@ import {
15
15
withKeys ,
16
16
withModifiers ,
17
17
} from 'vue'
18
- import { type IsUnion , describe , expectType } from './utils'
18
+ import { type IsAny , type IsUnion , describe , expectType } from './utils'
19
19
20
20
describe ( 'with object props' , ( ) => {
21
21
interface ExpectedProps {
@@ -1623,3 +1623,146 @@ declare const MyButton: DefineComponent<
1623
1623
{ }
1624
1624
>
1625
1625
; < MyButton class = "x" />
1626
+
1627
+ describe ( '__typeProps backdoor for union type for conditional props' , ( ) => {
1628
+ interface CommonProps {
1629
+ size ?: 'xl' | 'l' | 'm' | 's' | 'xs'
1630
+ }
1631
+
1632
+ type ConditionalProps =
1633
+ | {
1634
+ color ?: 'normal' | 'primary' | 'secondary'
1635
+ appearance ?: 'normal' | 'outline' | 'text'
1636
+ }
1637
+ | {
1638
+ color : 'white'
1639
+ appearance : 'outline'
1640
+ }
1641
+
1642
+ type Props = CommonProps & ConditionalProps
1643
+
1644
+ const Comp = defineComponent ( {
1645
+ __typeProps : { } as Props ,
1646
+ } )
1647
+ // @ts -expect-error
1648
+ ; < Comp color = "white" />
1649
+ // @ts -expect-error
1650
+ ; < Comp color = "white" appearance = "normal" />
1651
+ ; < Comp color = "white" appearance = "outline" />
1652
+
1653
+ const c = new Comp ( )
1654
+
1655
+ // @ts -expect-error
1656
+ c . $props = { color : 'white' }
1657
+ // @ts -expect-error
1658
+ c . $props = { color : 'white' , appearance : 'text' }
1659
+ c . $props = { color : 'white' , appearance : 'outline' }
1660
+ } )
1661
+
1662
+ describe ( '__typeEmits backdoor, 3.3+ object syntax' , ( ) => {
1663
+ type Emits = {
1664
+ change : [ id : number ]
1665
+ update : [ value : string ]
1666
+ }
1667
+
1668
+ const Comp = defineComponent ( {
1669
+ __typeEmits : { } as Emits ,
1670
+ mounted ( ) {
1671
+ this . $props . onChange ?.( 123 )
1672
+ // @ts -expect-error
1673
+ this . $props . onChange ?.( '123' )
1674
+ this . $props . onUpdate ?.( 'foo' )
1675
+ // @ts -expect-error
1676
+ this . $props . onUpdate ?.( 123 )
1677
+
1678
+ // @ts -expect-error
1679
+ this . $emit ( 'foo' )
1680
+
1681
+ this . $emit ( 'change' , 123 )
1682
+ // @ts -expect-error
1683
+ this . $emit ( 'change' , '123' )
1684
+
1685
+ this . $emit ( 'update' , 'test' )
1686
+ // @ts -expect-error
1687
+ this . $emit ( 'update' , 123 )
1688
+ } ,
1689
+ } )
1690
+
1691
+ ; < Comp onChange = { id => id . toFixed ( 2 ) } />
1692
+ ; < Comp onUpdate = { id => id . toUpperCase ( ) } />
1693
+ // @ts -expect-error
1694
+ ; < Comp onChange = { id => id . slice ( 1 ) } />
1695
+ // @ts -expect-error
1696
+ ; < Comp onUpdate = { id => id . toFixed ( 2 ) } />
1697
+
1698
+ const c = new Comp ( )
1699
+ // @ts -expect-error
1700
+ c . $emit ( 'foo' )
1701
+
1702
+ c . $emit ( 'change' , 123 )
1703
+ // @ts -expect-error
1704
+ c . $emit ( 'change' , '123' )
1705
+
1706
+ c . $emit ( 'update' , 'test' )
1707
+ // @ts -expect-error
1708
+ c . $emit ( 'update' , 123 )
1709
+ } )
1710
+
1711
+ describe ( '__typeEmits backdoor, call signature syntax' , ( ) => {
1712
+ type Emits = {
1713
+ ( e : 'change' , id : number ) : void
1714
+ ( e : 'update' , value : string ) : void
1715
+ }
1716
+
1717
+ const Comp = defineComponent ( {
1718
+ __typeEmits : { } as Emits ,
1719
+ mounted ( ) {
1720
+ this . $props . onChange ?.( 123 )
1721
+ // @ts -expect-error
1722
+ this . $props . onChange ?.( '123' )
1723
+ this . $props . onUpdate ?.( 'foo' )
1724
+ // @ts -expect-error
1725
+ this . $props . onUpdate ?.( 123 )
1726
+
1727
+ // @ts -expect-error
1728
+ this . $emit ( 'foo' )
1729
+
1730
+ this . $emit ( 'change' , 123 )
1731
+ // @ts -expect-error
1732
+ this . $emit ( 'change' , '123' )
1733
+
1734
+ this . $emit ( 'update' , 'test' )
1735
+ // @ts -expect-error
1736
+ this . $emit ( 'update' , 123 )
1737
+ } ,
1738
+ } )
1739
+
1740
+ ; < Comp onChange = { id => id . toFixed ( 2 ) } />
1741
+ ; < Comp onUpdate = { id => id . toUpperCase ( ) } />
1742
+ // @ts -expect-error
1743
+ ; < Comp onChange = { id => id . slice ( 1 ) } />
1744
+ // @ts -expect-error
1745
+ ; < Comp onUpdate = { id => id . toFixed ( 2 ) } />
1746
+
1747
+ const c = new Comp ( )
1748
+ // @ts -expect-error
1749
+ c . $emit ( 'foo' )
1750
+
1751
+ c . $emit ( 'change' , 123 )
1752
+ // @ts -expect-error
1753
+ c . $emit ( 'change' , '123' )
1754
+
1755
+ c . $emit ( 'update' , 'test' )
1756
+ // @ts -expect-error
1757
+ c . $emit ( 'update' , 123 )
1758
+ } )
1759
+
1760
+ defineComponent ( {
1761
+ props : {
1762
+ foo : [ String , null ] ,
1763
+ } ,
1764
+ setup ( props ) {
1765
+ expectType < IsAny < typeof props . foo > > ( false )
1766
+ expectType < string | null | undefined > ( props . foo )
1767
+ } ,
1768
+ } )
0 commit comments