-
Notifications
You must be signed in to change notification settings - Fork 13.1k
Closed
Labels
Design NotesNotes from our design meetingsNotes from our design meetings
Description
Consistently Filtering Out Negative Matches when Narrowing
- Reported as a regression in TypeScript 4.3
- When you're trying to narrow out a generic in opposite branches, you'd expect it to disappear.
- Started when we made a change in Allow filterType to consider union constraints of non-union types when determining never-ness #43763.
- We were trying to make changes by looking at the constraint of a type.
- In 3rd playground example, the types of
obj1andobj2should not be related to whatever's being assigned.- The same should be true of
obj3, but for various reasons we consider it to be "infinitely expanding" and just let that slip by the type system.
- The same should be true of
- This PR is a bit of a hack on top of a hack to fix that issue; we can recognize that the types are not identical, but you can defeat this with an intersection.
- What exactly is the "depth" we're talking about? What stack is being tracked?
- We have source type IDs and target type IDs that we place onto a stack.
- As we do more comparisons, we check to see whether a comparison we've already done on the stack veratim is there. If so, we say "maybe" the two original types are related.
- If the source or target sides have appeared more than N times (where N=5 today), then we mark that side of the comparison as "infinitely expanding", and if both sides are "infinitely expanding", we say the types are "maybe" related.
- Not 5 of the same type, 5 of the same "recursion identity, where sometimes a recursion identity is a type object.
- When we think we see a repeating pattern, we say "it's similar enough", and hope some other portion of the type will stop us.
- Track source and target relationship stack depth seperately, only increase on change in value #41821 is similar in spirit, but feels less like a hack - ensure that if one side isn't changing, we don't prematurely consider the type to be infinitely expanding.
-
So this avoids tracking "runs" of the same recurring type.
-
What do you do when you have two types that link back to themselves?
interface A { next: A; data: number; } interface B { next: B; data: number; }
- Do we push both?
- We rely on some behavior of how we break down each side.
- Unclear what this is right now.
-
- Changes in baselines for Track source and target relationship stack depth seperately, only increase on change in value #41821?
- Nope.
- Well, it reverts a questionable change caused by Allow filterType to consider union constraints of non-union types when determining never-ness #43763
- Have concern that we'll break something we haven't thought of.
- What is the concern? Not issuing an error to issuing an incorrect error?
- On one side we have a constraint that keeps on repeating but generating new type identities (never see the same type twice), but we keep entering the logic because we never see the type change.
- What is the concern? Not issuing an error to issuing an incorrect error?
Tagged Template Inferrence and Making TemplateStringsArray
Notes from @RyanCavanaugh
declare function tag<T extends TemplateStringsArray>(strs: T): T;
let tsa: TemplateStringsArray;
let x = tag `hello world`;tsalooks like aReadonlyArray<string>, plus arawproperty- In a function today, you can capture the string contents of a regular string with
T extends string - No corresponding behavior exists for tagged templates, i.e.
xisTemplateStringsArray - 36 👍 for the issue
- There's duplicates too though - const TemplateStringsArray for TaggedTemplateExpression #31422
- PR makes TemplateStringsArray generic, adding
TPartsandTRawParts - With a formatting hole, you get a splice point in the array
- This is only really interesting if the function returns the array
- With some galaxy brain type math you can constrain template holes by their corresponding raw parts; neat
- Implementation is minimal
- What is this for?
- Intl?
- Inviting type system abuse?
- Use cases here aren't super compelling, but feels like they could be?
- Let's see more
egriff38, ExE-Boss, tsugabloom, tjjfvi, brainkim and 1 more
Metadata
Metadata
Assignees
Labels
Design NotesNotes from our design meetingsNotes from our design meetings