Skip to content

Type narrowing not working correctly with Uppercase<string> & Lowercase<string>Β #63724

Description

πŸ”Ž Search Terms

"narrowing lowercase" "narrowing uppercase"

πŸ•— Version & Regression Information

  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about Common Bugs and Type System Behavior

⏯ Playground Link

https://www.typescriptlang.org/play/?#code/DYUwLgBAxg9grgOzAJwJ4GEYBMQC4IBEAQgKIEQA+hAMgKrlUEBy1BA3AFAewIDOkAB2QgAZgEsAHhAC8hAEYgCAOjAxaAgSGToAhrxAAKAJQQ9EdZuRQ9IADz9kYhAHMAfJw5iREA0NGSZaVliMkoqP3EpIOC6BnDhSMDglgITAG8OCCzoeCQ0TBwZCAjJTgB6MqyAPQ4KrIAVVE0IAHILLWt9exQnNxaIMV4IBBhIPV4xZwQdOVAIVXmmkFaQhhp6SkIUlqVayohG5paHXv7B4dHTXgmpmbmFsCWV0jWCWM3mVh2OAF8gA

πŸ’» Code

let countryCode: "BE" | "LU" | "NL";

const prefix = "be".toUpperCase() as Uppercase<string>;

if (prefix === "BE" || prefix === "LU" || prefix === "NL") {
    countryCode = prefix;
//  ^
//  Type 'Uppercase<string>' is not assignable to type '"BE" | "LU" | "NL"'.
//  Type 'string' is not assignable to type '"BE" | "LU" | "NL"'.
}

πŸ™ Actual behavior

TypeScript cannot narrow down an Uppercase<string> or Lowercase<string> type after explicitly comparing against specific values.

πŸ™‚ Expected behavior

TypeScript should accept the code above as "BE" | "LU" | "NL" is strictly a sub-type of Uppercase<string>.

Additional information about the issue

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugA bug in TypeScriptHelp WantedYou can do this

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions