ember-cli-typescript icon indicating copy to clipboard operation
ember-cli-typescript copied to clipboard

`getOwner(this)` returns `unknown` type

Open mydea opened this issue 3 years ago • 2 comments
trafficstars

Which package(s) does this problem pertain to?

  • [ ] @types/ember
  • [ ] @types/ember__string
  • [ ] @types/ember__polyfills
  • [ ] @types/ember__object
  • [ ] @types/ember__utils
  • [ ] @types/ember__array
  • [ ] @types/ember__engine
  • [ ] @types/ember__debug
  • [ ] @types/ember__runloop
  • [ ] @types/ember__error
  • [ ] @types/ember__controller
  • [ ] @types/ember__component
  • [ ] @types/ember__routing
  • [x] @types/ember__application
  • [ ] @types/ember__test
  • [ ] @types/ember__test-helpers
  • [ ] @types/ember__service
  • [ ] @types/ember-data
  • [ ] @types/rsvp
  • [ ] Other
  • [ ] I don't know

In v4 of the types, getOwner(this) returns an unknown type. As far as I can tell that is not really correct, it should either return some type of Owner or just an ApplicationInstance or something along this line?

mydea avatar Jan 25 '22 12:01 mydea

Thanks for the report! The problem is that Ember’s actual public API here is underspecified. See discussion at emberjs/ember.js#19916. Once we have that resolved, we’ll update these types accordingly!

chriskrycho avatar Jan 25 '22 16:01 chriskrycho

Documenting a workaround here while I work on trying to get emberjs/ember.js#19916 unblocked: you can write a module extension like this in your types locally:

declare module '@ember/application' {
  interface Owner { 
    lookup(fullName: string, options?: LookupOptions): T | undefined; 
    factoryFor(fullName: string, options?: LookupOptions): Factory<unknown, unknown> | undefined; 
    factoryFor(fullName: string, options?: LookupOptions): Factory<unknown, unknown> | undefined; 
    buildChildEngineInstance(name: string, options?: EngineInstanceOptions): EngineInstance; 
    register(fullName: string, factory: Factory<T, C>, options?: object): void; 
    hasRegistration(name: string, options?: LookupOptions): boolean; 
    mountPoint?: string; 
    routable?: boolean; 
  } 

  export function getOwner(object: unknown): Owner;
}

(This is basically a safer version of the types over in Ember.)

chriskrycho avatar Feb 10 '22 14:02 chriskrycho

I believe this issue has been resolved as of Ember 4.10. Hurray! :)

boris-petrov avatar Jan 13 '23 07:01 boris-petrov

Also as of the stable types. getOwner does the right thing and provides DI lookup capabilities. 🎉

chriskrycho avatar Sep 28 '23 23:09 chriskrycho