I have
interface Foo {
x: number;
y: number;
}
interface Bar {
foo: Foo | undefined;
}
declare const useBar: () => Bar;
const f = () => {
const { foo } = useBar();
// ...
}
I can use foo?.x
to access properties and this works. But in practice foo
has a lot more properties and I'd like to avoid ?.
everywhere.
In JavaScript I can write
const { foo = {} } = useBar();
and then use foo.x
and foo.y
safely (in TypeScript terms, the type of foo
is now Partial<Foo>
). In TS this gives
Property 'x' does not exist on type '{}'
Reasonable, but is there a way to avoid this problem and get a Partial<Foo>
anyway?
I see that
const { foo: { x, y } = {} } = useBar();
does work, but isn't ideal for my real use case; I'd have to rename them like
const { foo: { x: fooX, y: fooY } = {} } = useBar();
Rephrasing the question gave me an answer which works but I'm still hoping for something nicer:
EDIT: improved version
where
noFoo
would be in the same module asuseBar
.