Skip to content

Asserts on this from a member function does not narrow this #44212

@JarekToro

Description

@JarekToro

Bug Report

🔎 Search Terms

  • assert type guard
  • this type guard

possibly related to #43368

🕗 Version & Regression Information

Seems to effect all versions

⏯ 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    In DiscussionNot yet reached consensusSuggestionAn idea for TypeScript

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions