Proposal: Enhance String interface definition to support type inference for string literals #60456
Open
6 tasks done
Labels
Awaiting More Feedback
This means we'd like to hear from more people who would be helped by this feature
Suggestion
An idea for TypeScript
π Search Terms
string generic methods, string concat, checked domain literal types
Related issues #44268
β Viability Checklist
β Suggestion
Current Behavior:
Currently, any manipulation on string other then assigning to literals and using
${templates}
doesn't infer the type from literal string. Basic toString and valueOf will lose type of literal string in the process.Desired Behavior:
I propose enhancing the type definitions for String interface so that it can infer the exact type when used with string literals and templates. This would improve type safety and developer experience when working with string manipulation. At least valueOf, toString, toUpperCase, toLowerCase can be implemented without changing something other than the definition of String interface.
Example of Current Issue:
Proposed Solution:
Introduce a new type definition for
concat
that uses variadic tuple types to infer the correct concatenated string literal type:Benefits:
Potential Drawbacks:
Additional Context:
This change would particularly benefit scenarios where string templates or literal string concatenation are heavily used, enhancing the robustness of TypeScript's type system in string manipulation contexts.
Playground
π Motivating Example
In TypeScript, while working with string literals, certain operations like concatenation or transformations (e.g., toUpperCase, toLowerCase) typically result in the loss of specific literal types, being inferred as a general string. This can lead to a loss of valuable type information, resulting in less strict compile-time checks and the need for manual type assertions or annotations.
Consider the following example:
Here, despite knowing that basePath is "/api" and usersPath is "/users", TypeScript loses the literal type information after concatenation, inferring fullPath as string, rather than "/api/users". This loss of precision means we can't rely on TypeScript to enforce strict types when building paths or identifiers, leading to potential runtime errors.
π» Use Cases
To get rid of boilerplate when transforming strings and ensure that result of transformation satisfies the constraints
Explicit type declaration and cast after manipulations
Create a bunch of utils functions that work as a Proxy for calling built in methods
The text was updated successfully, but these errors were encountered: