ts-get
v1.0.5
Published
Alternative to lodash.get that makes it typed and cool as if optional chaining proposal is there
Downloads
2,265
Readme
ts-get
Alternative to lodash.get
that makes it typed and cool as if optional chaining proposal is there.
Means you're not only safely navigate object, but you're also getting 100% autocomplete and type-safeness 🎉
Usage and examples
import get from 'ts-get'
type SomeType = {
optionalField?: string
nested?: {
dangerousAccess?: string
}
} | undefined | null
const emptyObject: SomeType = {}
const withOneOptionalField: SomeType = {
optionalField: "value",
}
get(emptyObject, it => it.optionalField, "default") // -> "default"
get(withOneOptionalField, it => it.optionalField, "default") // -> "value"
get(withOneOptionalField, it => it.nested.dangerousAccess, "default") // -> "default"
get(withOneOptionalField, it => it.unknownField, "default") // -> Type error, `unknownField` doesn't exist on type
get(withOneOptionalField, it => it.optionalField, 5) // -> Type error, third argument is not assignable to type `string`
Difference with lodash.get
behavior
- If your path gets
null
at the end, it will bail out todefaultValue
orundefined
. If you would like to getnull
returned anyway, just pass it as adefaultValue
Known issues/limitations:
- If your type field is of type
null
and onlynull
orundefined
your field will be of type{}[]
. I have no idea how to fix it 🤷♂️ PR Welcome 😇🙏
type A = {
field: null | undefined// -> {}[] inside of the callback and as return type too
}
- If you return not a primitive but an object, all its nested fields will be
Required
e.g. allundefined
andnull
will be removed.
import get from 'ts-get'
type A = {
field?: {
optional?: string | null
}
}
const input: A = {}
const res = get(input, it => it.field)
res // <== Will be inferred as { optional: string }, without null and ? (undefined) which is wrong, but seems to be impossible to infer.
You can solve this issue passing down generics implicitly
import get from 'ts-get'
type A = {
field?: {
optional?: string | null
}
}
const input: A = {}
const res = get<A, A['field']>(input, it => it.field)
res // <== Will be inferred properly