ember-cli-typescript
ember-cli-typescript copied to clipboard
`getOwner(this)` returns `unknown` type
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?
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!
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.)
I believe this issue has been resolved as of Ember 4.10. Hurray! :)
Also as of the stable types. getOwner does the right thing and provides DI lookup capabilities. 🎉