8

In my Angular app, I'm trying to use a factory provider in my module:

export function getMyFactory(): () => Window {
  return () => window;
}

@NgModule({
  providers: [
    { provide: WindowRef, useFactory: getMyFactory() },
  ],
})
export class MyModule {}

but this is failing with:

Error encountered in metadata generated for exported symbol 'MyModule':

Metadata collected contains an error that will be reported at runtime: Lambda not supported

Community
  • 1
  • 1
Francesco Borzi
  • 37,945
  • 31
  • 126
  • 195

4 Answers4

15

I've found an easy solution reported on a thread from GitHub: Arrow lambda not supported in static function posted by haochi

The solution is basically:

assigning the result to a variable, then return the variable


So in my case, I've resolved by replacing:

export function getMyFactory(): () => Window {
  return () => window;
}

with:

export function getMyFactory(): () => Window {
  const res = () => window;
  return res;
}
Francesco Borzi
  • 37,945
  • 31
  • 126
  • 195
8

Just add the // @dynamic comment like this:

// @dynamic
export function getMyFactory(): () => Window {return () => window;}

More info in the angular docs

emmbee
  • 744
  • 4
  • 14
4

This same error happened to me in an Angular library.

I ignored it by setting "strictMetadataEmit": false, in tsconfig.lib.json under angularCompilerOptions.

adrisons
  • 1,923
  • 1
  • 16
  • 28
0

I had the same issue trying to return a promise as a function, and replaced this:

export function myFunc(): Function {
    const result = () => ...
    return result;
}

With:

export function myFunc(){
    const result = () => ...
    return result;
}
Jnr
  • 968
  • 1
  • 15
  • 29