fix(compiler): allow expressions or functions in extends (#14158)
Fixes #14154 PR Close #14158
This commit is contained in:
parent
8270bec343
commit
b4214d60a6
|
@ -86,7 +86,7 @@ export class StaticReflector implements ReflectorReader {
|
||||||
annotations = [];
|
annotations = [];
|
||||||
const classMetadata = this.getTypeMetadata(type);
|
const classMetadata = this.getTypeMetadata(type);
|
||||||
if (classMetadata['extends']) {
|
if (classMetadata['extends']) {
|
||||||
const parentType = this.simplify(type, classMetadata['extends']);
|
const parentType = this.trySimplify(type, classMetadata['extends']);
|
||||||
if (parentType && (parentType instanceof StaticSymbol)) {
|
if (parentType && (parentType instanceof StaticSymbol)) {
|
||||||
const parentAnnotations = this.annotations(parentType);
|
const parentAnnotations = this.annotations(parentType);
|
||||||
annotations.push(...parentAnnotations);
|
annotations.push(...parentAnnotations);
|
||||||
|
@ -303,6 +303,17 @@ export class StaticReflector implements ReflectorReader {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simplify but discard any errors
|
||||||
|
*/
|
||||||
|
private trySimplify(context: StaticSymbol, value: any): any {
|
||||||
|
const originalRecorder = this.errorRecorder;
|
||||||
|
this.errorRecorder = (error: any, fileName: string) => {};
|
||||||
|
const result = this.simplify(context, value);
|
||||||
|
this.errorRecorder = originalRecorder;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/** @internal */
|
/** @internal */
|
||||||
public simplify(context: StaticSymbol, value: any): any {
|
public simplify(context: StaticSymbol, value: any): any {
|
||||||
const self = this;
|
const self = this;
|
||||||
|
|
|
@ -679,6 +679,30 @@ describe('StaticReflector', () => {
|
||||||
'hook1', 'hook2', 'hook3'
|
'hook1', 'hook2', 'hook3'
|
||||||
])).toEqual([false, false, false]);
|
])).toEqual([false, false, false]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should allow inheritance from expressions', () => {
|
||||||
|
initWithDecorator({
|
||||||
|
'/tmp/src/main.ts': `
|
||||||
|
export function metaClass() { return null; };
|
||||||
|
export class Child extends metaClass() {}
|
||||||
|
`
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(reflector.annotations(reflector.getStaticSymbol('/tmp/src/main.ts', 'Child')))
|
||||||
|
.toEqual([]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should allow inheritance from functions', () => {
|
||||||
|
initWithDecorator({
|
||||||
|
'/tmp/src/main.ts': `
|
||||||
|
export let ctor: {new(): T} = function() { return null; }
|
||||||
|
export class Child extends ctor {}
|
||||||
|
`
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(reflector.annotations(reflector.getStaticSymbol('/tmp/src/main.ts', 'Child')))
|
||||||
|
.toEqual([]);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue