Closed
Description
Bug Report
Basically I'm using &
types as if subclassing. BaseValue
has items
array with fewer properties, ExtendedValue
extends that with items
with more properties.
🔎 Search Terms
intersection, ampersand, override, inheritance. Also looked at the titles of first 2 pages of open issues.
🕗 Version & Regression Information
- This changed between versions 4.9.5 and 5.0.2
- There is an easy work-around, but I'm not sure if it should be necessary.
⏯ Playground Link
TypeScript 5.0.2 (error) vs 4.9.5 (OK)
💻 Code
type BaseItem = {
id: number;
}
type ExtendedItem = BaseItem & {
description: string | null
};
type BaseValue = {
// there are other fields
items: BaseItem[];
}
type ExtendedValue = BaseValue & {
// there are other fields
items: ExtendedItem[];
}
const TEST_VALUE: ExtendedValue = {
items: [ // ❌ ERROR: This is NOT allowed *iff* mixed types are used in `description`
{id: 1, description: null},
{id: 2, description: 'wigglytubble'},
]
};
🙁 Actual behavior
Seems to me like they should be compatible. Also these examples are ✅ allowed in TS 5.0.2 if description
only has uniform types, e.g.:
// ✅ Allowed: description has only strings
const ONLY_STRINGS: ExtendedValue = {
items: [
{id: 1, description: 'bollywoggle'},
{id: 2, description: 'wigglytubble'},
]
};
// ✅ Allowed: description has only nulls
const ONLY_NULLS: ExtendedValue = {
items: [
{id: 1, description: null},
{id: 2, description: null},
]
};
🙂 Expected behavior
Seems like it should be allowed.
🙄 Work-around
Typing ExtendedValue
with Omit<>
seems to fix the issue with no obvious downsides.
type ExtendedValue = Omit<BaseValue, 'items'> & {
// there are other fields
items: ExtendedItem[];
}