-
Notifications
You must be signed in to change notification settings - Fork 13.3k
Open
Labels
In DiscussionNot yet reached consensusNot yet reached consensusSuggestionAn idea for TypeScriptAn idea for TypeScript
Description
Bug Report
🔎 Search Terms
- assert type guard
- this type guard
possibly related to #43368
🕗 Version & Regression Information
Seems to effect all versions
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about
- https://github.com/microsoft/TypeScript/wiki/FAQ#why-is-astring-assignable-to-anumber-for-interface-at--
- https://github.com/microsoft/TypeScript/wiki/FAQ#why-doesnt-x-instanceof-foo-narrow-x-to-foo
- https://github.com/microsoft/TypeScript/wiki/FAQ#why-doesnt-isfoox-narrow-x-to-foo-when-isfoo-is-a-type-guard
⏯ Playground Link
Playground link with relevant code
💻 Code
/* Setup */
class SuccessResult<T> {
success: true = true;
constructor(public value: T) {}
throwOnFailure(): asserts this is SuccessResult<T> {}
isSuccess(): this is SuccessResult<T> {
return this.success;
}
}
class FailureResult<T, E extends Error> {
success: false = false;
constructor(public error: E) {}
throwOnFailure(): asserts this is SuccessResult<T> {
throw this.error;
}
isSuccess(): this is SuccessResult<T> {
return this.success;
}
}
type OperationResult<T = never, E extends Error = Error> =
| SuccessResult<T>
| FailureResult<T, E>;
function workingAssertGuard<T>(result: OperationResult<T>): asserts result is SuccessResult<T> {
if (!result.success){
throw result.error
}
}
/* End Setup */
const result: OperationResult<string> = {} as OperationResult<string>
/* This is the issue */
function assertThisType(){
result.throwOnFailure()
// type is unchanged
result // OperationResult<string, Error>
}
/* End of issue */
/* The rest below works as intended */
function narrowOnProperty(){
// Working narrowing from prop
if (result.success){
result.value // SuccessResult<string>
} else {
result.error // FailureResult<string, Error>
}
}
function assertTypeGuard(){
// Working narrowing from Assert Type Guard Function
workingAssertGuard(result)
result.value // SuccessResult<string>
}
function narrowThisTypeGuard(){
// Working narrowing from boolean Type Guard Member Function
if (result.isSuccess()) {
result.value // SuccessResult<string>
} else {
result.error // FailureResult<string, Error>
}
}🙁 Actual behavior
Asserts on this from a member function does not narrow this
🙂 Expected behavior
Asserts on this from a member function does narrow this
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
In DiscussionNot yet reached consensusNot yet reached consensusSuggestionAn idea for TypeScriptAn idea for TypeScript