You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
typeExample<T>=Textends{} ? keyofT : stringconstunknownConstraint=<Textendsunknown>(x: Example<T>): string=>xconstnoConstraint=<T>(x: Example<T>): string=>x// ^// Type 'string | number | symbol' is not assignable to type 'string'.// Type 'number' is not assignable to type 'string'.
🙁 Actual behavior
The T extends unknown version behaves differently from the unconstrained version.
🙂 Expected behavior
The two versions should have the same behavior, probably both being rejected since code like this is unsafe:
My theory is that this is for backwards compatibility when symbol keys were being added.
You can also get this behavior with any type whenever the apparent type of keyof T does NOT extend symbol | number.
For example:
constobjectConstraint=<Textends{abc: number}>(x: Example<T>): string=>x// OkconstnumberConstraint=<Textends123>(x: Example<T>): string=>x// Ok// ^ `keyof 123` happens to be only strings so also okay.
Notably this means that T extends {} actually errors. This furthers my hypothesis that the test is extends symbol | number ? error : do nothing because never technically extends symbol | number. To further this T extends {} | 1 doesn't error.
This does still leave unknown as a second special case though.
🔎 Search Terms
"extends unknown" "type parameter" "generic" "conditional type" "keyof" "string" "assignable"
🕗 Version & Regression Information
⏯ Playground Link
https://www.typescriptlang.org/play/?jsx=0#code/C4TwDgpgBAogHgQwLZgDYQDwBUB8UC8UWUEcwEAdgCYDOUA3gL5QD8UA1hCAPYBmRUAFxQawAE4BLCgHMAULIDG3CqKgBXCuwrcA7hQDCy0WIRTgBKNhJlKtdZu16cACjjD4yNJlwBKYcalpAjw4eSUVc21DCJMzC2wXN1hEFHQEvxFxQOCoOCA
💻 Code
🙁 Actual behavior
The
T extends unknown
version behaves differently from the unconstrained version.🙂 Expected behavior
The two versions should have the same behavior, probably both being rejected since code like this is unsafe:
Additional information about the issue
I was asked about this and eventually narrowed down the behavior to the example above.
#61203 is also possibly related?
The text was updated successfully, but these errors were encountered: