types(runtime-core): improve the extracted instance types (#1936)
This commit is contained in:
		
							parent
							
								
									475dd04ec9
								
							
						
					
					
						commit
						955450f539
					
				@ -189,7 +189,8 @@ export function defineComponent<
 | 
			
		||||
    Extends,
 | 
			
		||||
    E,
 | 
			
		||||
    VNodeProps & AllowedComponentProps & ComponentCustomProps
 | 
			
		||||
  >
 | 
			
		||||
  > &
 | 
			
		||||
    Readonly<ExtractPropTypes<PropsOptions>>
 | 
			
		||||
> &
 | 
			
		||||
  ComponentOptionsWithObjectProps<
 | 
			
		||||
    PropsOptions,
 | 
			
		||||
 | 
			
		||||
@ -94,7 +94,7 @@ describe('with object props', () => {
 | 
			
		||||
      // default + function
 | 
			
		||||
      ffff: {
 | 
			
		||||
        type: Function as PropType<(a: number, b: string) => { a: boolean }>,
 | 
			
		||||
        default: (a: number, b: string) => ({ a: true })
 | 
			
		||||
        default: (a: number, b: string) => ({ a: a > +b })
 | 
			
		||||
      },
 | 
			
		||||
      validated: {
 | 
			
		||||
        type: String,
 | 
			
		||||
@ -799,3 +799,58 @@ describe('componentOptions setup should be `SetupContext`', () => {
 | 
			
		||||
    ctx: SetupContext
 | 
			
		||||
  ) => any)
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
describe('extract instance type', () => {
 | 
			
		||||
  const Base = defineComponent({
 | 
			
		||||
    props: {
 | 
			
		||||
      baseA: {
 | 
			
		||||
        type: Number,
 | 
			
		||||
        default: 1
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  })
 | 
			
		||||
  const MixinA = defineComponent({
 | 
			
		||||
    props: {
 | 
			
		||||
      mA: {
 | 
			
		||||
        type: String,
 | 
			
		||||
        default: ''
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  })
 | 
			
		||||
  const CompA = defineComponent({
 | 
			
		||||
    extends: Base,
 | 
			
		||||
    mixins: [MixinA],
 | 
			
		||||
    props: {
 | 
			
		||||
      a: {
 | 
			
		||||
        type: Boolean,
 | 
			
		||||
        default: false
 | 
			
		||||
      },
 | 
			
		||||
      b: {
 | 
			
		||||
        type: String,
 | 
			
		||||
        required: true
 | 
			
		||||
      },
 | 
			
		||||
      c: Number
 | 
			
		||||
    }
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  const compA = {} as InstanceType<typeof CompA>
 | 
			
		||||
 | 
			
		||||
  expectType<boolean>(compA.a)
 | 
			
		||||
  expectType<string>(compA.b)
 | 
			
		||||
  expectType<number | undefined>(compA.c)
 | 
			
		||||
  // mixins
 | 
			
		||||
  expectType<string>(compA.mA)
 | 
			
		||||
  // extends
 | 
			
		||||
  expectType<number>(compA.baseA)
 | 
			
		||||
 | 
			
		||||
  //  @ts-expect-error
 | 
			
		||||
  expectError((compA.a = true))
 | 
			
		||||
  //  @ts-expect-error
 | 
			
		||||
  expectError((compA.b = 'foo'))
 | 
			
		||||
  //  @ts-expect-error
 | 
			
		||||
  expectError((compA.c = 1))
 | 
			
		||||
  //  @ts-expect-error
 | 
			
		||||
  expectError((compA.mA = 'foo'))
 | 
			
		||||
  //  @ts-expect-error
 | 
			
		||||
  expectError((compA.baseA = 1))
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user