Description
π Search Terms
empty object type, {}
, type safety violation, unsound
π Version & Regression Information
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about object types and structural typing
β― Playground Link
π» Code
function takesObject(x: object) {
// This rightly is a TS error.
if (x === 0) {
console.error('This branch should be unreachable');
}
}
const o: {} = 0;
// But this isn't, and should be.
takesObject(o);
π Actual behavior
No error on takesObject(o)
. {}
can be assigned to type object
, despite {}
meaning "all nonnullish values", whereas object
means only JS object types.
π Expected behavior
Error on takesObject(o)
. {}
is a wider type than object
.
Additional information about the issue
This stems from a typescript-eslint investigation into making no-unnecessary-condition be more correct around possibly-falsy "object types", such as {}
, or even { toFixed(): string}
(to which number
may be assigned). See typescript-eslint/typescript-eslint#10378. This also relates to previous (controversial) conversations about whether to flag the {}
type with the linter, see, e.g. typescript-eslint/typescript-eslint#8700.
I'm wondering if this was simply an oversight in #49119, which aimed to fix soundness holes with {}
?