microsoft / microsoft/TypeScript
union of pattern template literals intersected with optional brand mutually assignable to one with incompatible brand
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Go
- Sterne
- 111k
- Forks
- 14.3k
- Ø Merge
- 2 T. 4 Std.
- Gemergte PRs (30 T.)
- 132
Beschreibung
🔎 Search Terms
brand, flavor, pattern template literal, placeholder, union, intersection, optional, assignable
🕗 Version & Regression Information
- This changed between versions 4.3.0-dev.20210330 and 4.3.0-dev.20210331
- This changed in commit or PR #43440, I think
⏯ Playground Link
💻 Code
type TmpLitUnion = `0${string}` | `1${string}`
type BrandX = TmpLitUnion & { a?: "x" };
type BrandY = TmpLitUnion & { a?: "y" };
declare const brandY: BrandY;
const brandX: BrandX = brandY; // <-- no error
🙁 Actual behavior
BrandX and BrandY are mutually assignable, even though they have an incompatible optional a property.
🙂 Expected behavior
There should be an error when trying to assign a BrandY to a BrandX or vice versa.
Additional information about the issue
This is from a Stack Overflow question. Looks like optional brands (this is called... "flavored" I guess?) don't distinguish between unions-of-pattern-template-literals. If you get rid of the union, you get the expected error:
type TmpLit = `0${string}`;
type BrandX = TmpLit & { a?: "x" };
type BrandY = TmpLit & { a?: "y" };
declare const brandY: BrandY;
const brandX: BrandX = brandY; // <-- error
Or if you add something else to the union, you get the expected error:
type TmpLitUnionOrSomethingElse = `0${string}` | `1${string}` | "somethingElse"
type BrandX = TmpLitUnionOrSomethingElse & { a?: "x" };
type BrandY = TmpLitUnionOrSomethingElse & { a?: "y" };
declare const brandY: BrandY;
const brandX: BrandX = brandY; // <-- error
Or if the brand is not optional, etc.
Not sure if this is a bug or a design limitation, or somehow intentional.
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Reproduziere die Aufgabe im verlinkten TypeScript Playground und vergleiche sie anschließend mit den Beispielen ohne Union und ohne optionales Brand im Issue. Untersuche die Zuweisbarkeit von Vereinigungen von Pattern-Template-Literals, die mit optionalen Eigenschaften geschnitten sind; als erledigt gilt die Aufgabe, wenn BrandX und BrandY nicht mehr gegenseitig zuweisbar sind und die gemeldeten Vergleichsfälle weiterhin korrekt bleiben.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- typescript
- Bereich
- compilers
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Ruhig
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 52/100