Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

assert type refinements don't work in expressions #60841

Open
Gozala opened this issue Dec 22, 2024 · 1 comment
Open

assert type refinements don't work in expressions #60841

Gozala opened this issue Dec 22, 2024 · 1 comment

Comments

@Gozala
Copy link

Gozala commented Dec 22, 2024

πŸ”Ž Search Terms

  • asserts

πŸ•— Version & Regression Information

  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about this

⏯ Playground Link

https://www.typescriptlang.org/play/?#code/GYVwdgxgLglg9mABAZygJxmA5gCgG4CGANiAKYBci4A1mHAO5gCUlByypaUyihJpiGD1QZsiAN4AoRDMHBEOKAE8ADqTjy+ZRAEIAvIgBEIzFkNMJ02dagALNA0RhS9RABVVpAKJoHaHAAGXgAeatCkACaIBCjopgFMVjIAvpKpkhAIqIj0cGjUPAY4yHAgaBAUVGC0DMyIegB8ltYm2MWl5aSJ1mikUGVIJWUVAHRQcACqKmpoAMJspDiJ6Zlg2QBGvQQF9QpDnZQ0dIwWjc2yqyVEpCNEcLitDx0VTN2yvf1og88341Mz8w4SzSkgyWSg0SIJU2pG2hT2P0O1WOdTOAG0krFRE9hl0ADSY-ajP7TTiAxaJAC6QA

πŸ’» Code

function string(value: unknown): asserts value is string {
    if (typeof value != "string") {
        throw new TypeError(`Expected a string`)
    }
}

const works = (source: unknown) => {
    string(source)
    return source.toUpperCase()
}

const breaks = (source: unknown) => {
    console.log(string(source))
    return source.toUpperCase()
}

const alsobreaks = (source: unknown) => [
    string(source),
    source.toUpperCase()
]```


### πŸ™ Actual behavior

Functions `break` and `alsobreak` do not type check and produce following error: "'source' is of type 'unknown'.", because type refinement produced by function "string" don't seem to apply, if asserting function is not a statement.

### πŸ™‚ Expected behavior

I would expect all three functions to type check, because `string` type refinement should apply to even if refinement is nested in an expression.

### Additional information about the issue

Provided example seems contrived because it was reduced to bare minimum, however there are legitimate uses for refinements like the above [for example](https://www.typescriptlang.org/play/?#code/MYGwhgzhAEBqYCcA8AVaBeaBXAdgaxwHsB3HAPmgG8AoaaAFwE8AHAUwC5ocsQQAfCPQQBLHAHNa0YIRyCEWYPUIIAFAEoqkuvQAWwiADombDFx4hJAX0kBbMPWA6VANzAgsHbPiKk1nV+6s0PrQaDR0dMIAZtAqxqyEMQEe0ACE6Ji6+kYsrBrhEdo6CCRcrMShuQCiCCWqAAbwgdAAJJTJrJbQACaErDBE9FIyUcIINgyEDLmtlFmG8Zb1alrQXawgEEEFhQis9FgIOAzyrKvWdNbW1PGhrOOoprgEJOSmaHxwiKhk1NSgkBgAEkcEMCoJ7MJgNA7A4nPR7jZOChEX5oID7vQYAjxsEYCiHtwbAAje4UHbBGJxXKJBiItIZaAAciJpIQTOgADJOdAAHJYEn3Az6EEIsT3OKo-KrCK6EoVHDlSpsGp1FRMqoADzYilY3XRZkF7JWhQua2o1wBUGgAAVCKIwZIIfQoTD7I4VBBCIdgJ5KNBNZx4MhWWSADTQRhB76hhAUSzSwoAeiT0AM6asFr+KegAEEoJiYMRlHh0cAStbnawbKxQRB-jJBAHTIqKsHqKKDLCPZqVnaHV33U5-ZqI1Hmwm-tQcwARPoDQhDYsIUuiaCsbV7KDCRsN2RDRgtpXt6SyQggVgGECEMQqSSd7tORhqMOSfugwdwlQjziMMe-tYVhWPcm1POQwAdGBMAAbXvD9HxUZ9Xzod96E-D0f0jf9I0A6gAF0-iiXBFB3Y5HAgnBPW9BBfU4Z4fBwRNoD2A4jikHQKKzEChgALyPNtEBA89L2vW8HyHFQeLUPt7XgiTMJ47C+ITIA) when composing set of constraints for later execution.
@MartinJohns
Copy link
Contributor

This is working as intended. See #32695.

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants