Microsoft/TypeScript
Auf GitHub ansehenInterface type coercion fails with unsatisfied properties in unions
Open
#59.716 geöffnet am 22. Aug. 2024
BugDomain: check: Type InferenceHelp Wanted
Repository-Metriken
- Stars
- (48.455 Stars)
- PR-Merge-Metriken
- (Durchschn. Merge 6T 17h) (9 gemergte PRs in 30 T)
Beschreibung
🔎 Search Terms
interface type coercion type coercion unsatisfied union constraints property missing in but required conditional interference
🕗 Version & Regression Information
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about type coercion
⏯ Playground Link
💻 Code
interface A {
step: 1
}
interface B {
step: 2
}
interface B_Ext extends B {
step: 2
extras: "very cool"
}
type Step = 1 | 2
type Consumer = A | (B | B_Ext);
const func = (): Step => Math.random() > 0.5 ? 2 : 1;
const consumer = (whatever: Consumer) => { }
const step = func();
// ✅ works
if(step === 1) {
consumer({ step })
} else {
consumer({ step })
}
// ❌ fails
consumer({ step })
🙁 Actual behavior
The compiler expects that all properties of a sub-constituent be satisfied
🙂 Expected behavior
The union defines that it is either A | B and B might be B or B & Extras
Additional information about the issue
The same happens with types instead of interfaces as well as a the extras being passed as union of the type:
// causes the same issues
type A = { step: 1 }
type B = { step: 2 } & ({} | { extras: 'very good' })