Skip to content

Design Meeting Notes, 8/18/2021 #45504

@DanielRosenwasser

Description

@DanielRosenwasser

Consistently Filtering Out Negative Matches when Narrowing

#45205
#41821

Playground Samples

  • 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.
  • 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?
  • 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.

Tagged Template Inferrence and Making TemplateStringsArray

#31422
#33304
#45310

Notes from @RyanCavanaugh

declare function tag<T extends TemplateStringsArray>(strs: T): T;

let tsa: TemplateStringsArray;
let x = tag `hello world`;
  • tsa looks like a ReadonlyArray<string>, plus a raw property
  • 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. x is TemplateStringsArray
  • 36 👍 for the issue
  • PR makes TemplateStringsArray generic, adding TParts and TRawParts
  • 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Design NotesNotes from our design meetings

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions