13

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
  • 56,083
  • 47
  • 179
  • 252

4 Answers4

23

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
  • 56,083
  • 47
  • 179
  • 252
14

Just add the // @dynamic comment like this:

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

More info in the angular docs

meblum
  • 1,654
  • 12
  • 23
6

This same error happened to me in an Angular library.

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

adrisons
  • 3,443
  • 3
  • 32
  • 48
1

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
  • 1,504
  • 2
  • 21
  • 36