To install in your ember app:
ember install ember-typescript-utils
Some utilities I find useful in an Ember with Typescript app. Just a quick read below for usage.
The functions below can be imported as the default from their own paths (as shown in the examples),
or as additional imports from ember-typescript-utils
.
For example, either of these is valid:
import typeSafeGet from 'ember-typescript-utils/type-safe-get';
import { typeSafeGet } from 'ember-typescript-utils';
As Chris Krycho points out, there are two ways to get at nested keys in Ember.
import { get } from '@ember/object';
const value = get(get(get(anObject, 'some'), 'nested'), 'key');
import { get } from '@ember/object';
// @ts-ignore -- deep lookup with possibly missing parents
const value = get(anObject, 'some.nested.key');
The first example is type safe, and the second is not. In addition to being kind of ugly,
the first example will explode if any part of anObject.some.nested.key
is undefined or null
(except for key
, it won't blow up then).
So why not have both? Slightly different syntax, but it will type check all the way to
8 levels of nesting and will return undefined
if part of the nested path is missing:
import typeSafeGet from 'ember-typescript-utils/type-safe-get';
const value = typeSafeGet(anObject, 'some', 'nested', 'key');
The type of safeGet is always derived from the object passed in, plus a possible undefined.
For example if anObject
had an interface of {some: {nested: {key: string}}}
, then
Typescript would check value as string | undefined
.
Same idea as above, except you can use dot notation, and just pass in the expected type.
import overrideGet from 'ember-typescript-utils/override-get';
const value = overrideGet<string>(anObject, 'some.nested.key');
This one has no upward limit on how deeply nested a key can be.