File tree 2 files changed +51
-4
lines changed
2 files changed +51
-4
lines changed Original file line number Diff line number Diff line change @@ -755,6 +755,35 @@ describe('resolveType', () => {
755
755
` )
756
756
) . not . toThrow ( )
757
757
} )
758
+
759
+ test ( 'error against failed extends' , ( ) => {
760
+ expect ( ( ) =>
761
+ resolve ( `
762
+ import type Base from 'unknown'
763
+ interface Props extends Base {}
764
+ defineProps<Props>()
765
+ ` )
766
+ ) . toThrow ( `@vue-ignore` )
767
+ } )
768
+
769
+ test ( 'allow ignoring failed extends' , ( ) => {
770
+ let res : any
771
+
772
+ expect (
773
+ ( ) =>
774
+ ( res = resolve ( `
775
+ import type Base from 'unknown'
776
+ interface Props extends /*@vue-ignore*/ Base {
777
+ foo: string
778
+ }
779
+ defineProps<Props>()
780
+ ` ) )
781
+ ) . not . toThrow ( `@vue-ignore` )
782
+
783
+ expect ( res . props ) . toStrictEqual ( {
784
+ foo : [ 'String' ]
785
+ } )
786
+ } )
758
787
} )
759
788
} )
760
789
Original file line number Diff line number Diff line change @@ -322,11 +322,29 @@ function resolveInterfaceMembers(
322
322
const base = typeElementsToMap ( ctx , node . body . body , node . _ownerScope )
323
323
if ( node . extends ) {
324
324
for ( const ext of node . extends ) {
325
- const { props } = resolveTypeElements ( ctx , ext , scope )
326
- for ( const key in props ) {
327
- if ( ! hasOwn ( base . props , key ) ) {
328
- base . props [ key ] = props [ key ]
325
+ if (
326
+ ext . leadingComments &&
327
+ ext . leadingComments . some ( c => c . value . includes ( '@vue-ignore' ) )
328
+ ) {
329
+ continue
330
+ }
331
+ try {
332
+ const { props } = resolveTypeElements ( ctx , ext , scope )
333
+ for ( const key in props ) {
334
+ if ( ! hasOwn ( base . props , key ) ) {
335
+ base . props [ key ] = props [ key ]
336
+ }
329
337
}
338
+ } catch ( e ) {
339
+ ctx . error (
340
+ `Failed to resolve extends base type.\nIf this previously worked in 3.2, ` +
341
+ `you can instruct the compiler to ignore this extend by adding ` +
342
+ `/* @vue-ignore */ before it, for example:\n\n` +
343
+ `interface Props extends /* @vue-ignore */ Base {}\n\n` +
344
+ `Note: both in 3.2 or with the ignore, the properties in the base ` +
345
+ `type are treated as fallthrough attrs at runtime.` ,
346
+ ext
347
+ )
330
348
}
331
349
}
332
350
}
You can’t perform that action at this time.
0 commit comments