Skip to content

Design Meeting Notes, 11/06/2015 #5554

@RyanCavanaugh

Description

@RyanCavanaugh

String literal types (#5185, #5156, #1003)

  • These types describe values that can be of certain literal values
  • They are introduced on to string literals via contextual typing
  • Very similar to enums in their semantics
  • Compared using string equality (case-sensitive, escaping/etc does not matter)
  • What's the difference compared to string enums?
    • Less complex
    • We don't need symbolic names for strings like we do for numbers
    • Does not introduce branding of the constituents in the same way
  • What is the future of enums?
    • e.g. string values?
    • Not clear that e.g. var x: 0|42|88; is a use case
  • We could show these string literals in completion lists
  • Does this work for consolidating string overload sets (e.g. MouseEvent) ?
    • Yep (e.g. function onEvent(name: "click|drag|move")): void;)
  • Why isn't the type of uncontextually-typed 'foo' === 'foo' ?
    • Why can't we solve this through widening?
    • Can we solve this by making union types of string literals be StringLike?
    • Acceptable leak to allow "foo"|"bar" === "baz"|"thing"
  • Does this have any explicit logic about narrowing?
    • No
  • Open questions
    • Should we add these to type guards?
      • What value does that add?
        • Useful only in the "removing from a union" case
    • ADTs of type guards (see Anders' first comment in Singleton types under the form of string literal types #1003)
      • Would this fall out of a correct implementation of string literal type guards + property-based type guards?
      • Also add enum value types in a future PR
    • Which comes first - enum values or property-based narrowing?
      • Whichever
    • Outcome: Approve enum-value types and property-based type guards. Issue #s to follow.

Comparable relation (#5300)

  • What do we need this for?
  • Why do we need a new relation?
    • Some solution is needed
    • But this is overkill
      • Has issues with perf due to a lack of caching
  • Agreement that this is the desired behavior
  • Move implementation to the operand logic
    • But this loses recursiveness
    • Is that desirable?
    • Recursiveness is not obviously correct here; top-level should be sufficient
    • Not clear that anyone has run into this
  • Which is preferable -- adding the extra cache or having this weirdish logic in multiple places?
  • Does implementing this at operator level solve the use cases?
    • Probably?
  • Decision: Move this logic to the operators, do not add a new relation

Module file extensions

  • Question for Brian - file extensions on modules?
    • Module loader WG has said you must write from "foo.js" instead of from "foo"; system.js has implemented this behavior
      • This is only for the browser, not node -- non-browser implmentors might do other stuff
    • But people want to write code that runs in both places. What are they supposed to do? :rage3:
    • Is the fix to have packagers (e.g. browserify) modify the filenames during transform?
      • Maybe
      • But that is ridiculous. Bifurcates the world when it used to be platform-agnostic

Metadata

Metadata

Assignees

No one assigned

    Labels

    Design NotesNotes from our design meetings

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions