Narrow String#toLowerCase/toUpperCase return types via Lowercase/Uppercase#63460
Narrow String#toLowerCase/toUpperCase return types via Lowercase/Uppercase#63460ljharb wants to merge 1 commit intomicrosoft:mainfrom
Conversation
|
This PR doesn't have any linked issues. Please open an issue that references this PR. From there we can discuss and prioritise. |
1 similar comment
|
This PR doesn't have any linked issues. Please open an issue that references this PR. From there we can discuss and prioritise. |
|
#44268 is not approved |
That's not the case, interface String {
foo<T extends string>(this: T): Lowercase<T>;
}
function returnFoo(s: string) {
return s.foo();
}
let x = returnFoo("bar");
// ^ Lowercase<string>
x = escape(x);
// TS2322: Type 'string' is not assignable to type 'Lowercase<string>'. |
|
whoops. i'll try to fix that. |
…rcase Make String.prototype.toLowerCase and toUpperCase preserve string-literal types in their return type, by typing them as `<T extends string>(this: T): Lowercase<T>` and `Uppercase<T>` respectively. For non-literal `string` receivers, `Lowercase<string>` resolves to `string`, preserving existing behavior. For literal receivers (e.g. `"FOO".toLowerCase()`), the result narrows to the corresponding literal (`"foo"`). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
c10ff7d to
7d2272d
Compare
|
@RyanCavanaugh sorry, i didn't realize there was an issue already. is there any reason it can't be approved now? |
See discussion in the "Read More" valley starting at #44268 (comment) |
Make String.prototype.toLowerCase and toUpperCase preserve string-literal types in their return type, by typing them as
<T extends string>(this: T): Lowercase<T>andUppercase<T>respectively.For non-literal
stringreceivers,Lowercase<string>resolves tostring, preserving existing behavior. For literal receivers (e.g."FOO".toLowerCase()), the result narrows to the corresponding literal ("foo").Also filed as microsoft/typescript-go#3711