Closed
Description
TypeScript Version: 3.5.1
Search Terms: is not assignable to, discriminated union
Code
export const enum PatternKind {
Known = "Known",
Unknown = "Unknown"
}
export type Pattern1 = {
kind: PatternKind.Known;
name: "Pattern1";
pattern1_attribute: string;
};
export type Pattern2 = {
kind: PatternKind.Known;
name: "Pattern2";
pattern2_attribute: string;
};
export type KnownPattern = Pattern1 | Pattern2;
export type UnknownPattern = {
kind: PatternKind.Unknown;
name: string;
};
export type Pattern = KnownPattern | UnknownPattern;
function getPattern(): Pattern {
// TODO: implement
throw new Error("");
}
const pattern: Pattern = getPattern();
if (pattern.kind === PatternKind.Known) {
if (pattern.name === "Pattern1") {
// Error, pattern1_attribute is not accessible
pattern.pattern1_attribute = "foo";
// Error, pattern is not assignable to Pattern1
let pattern1: Pattern1 = pattern;
pattern1 = pattern1;
}
}
if (pattern.kind === PatternKind.Known) {
// But for some reason, storing pattern in a KnownPattern variable first makes it work, even
// though after the "pattern.kind === PatternKind.Known" above, the compiler is already
// recognizing pattern to be a KnownPattern (which is why pattern can be assigned to the
// KnownPattern variable by the way)
const knownPattern: KnownPattern = pattern;
if (knownPattern.name === "Pattern1") {
// No error, pattern1_attribute is accessible
knownPattern.pattern1_attribute = "foo";
// No error, knownPattern is assignable to Pattern1
let pattern1: Pattern1 = knownPattern;
pattern1 = pattern1;
}
}
Expected behavior: no compiler errors
Actual behavior: compiler errors