# Function: unwrapError()

Extracts the error value from a [Result](../types/Result.Result.md) or [ResultAsync](../types/Result.ResultAsync.md).

If the input is a [Success](../types/Result.Success.md), it will throw the success value or return the default value if provided.

## Type Param

**R**

The input [Result](../types/Result.Result.md) or [ResultAsync](../types/Result.ResultAsync.md).

## Type Param

**T**

The default value type (optional).

## Examples

**Failure Case (without default)**

```ts
import { Result } from '@praha/byethrow';

const result: Result.Result<number, string> = Result.fail('Oops');
const error = Result.unwrapError(result); // 'Oops'
```

**Failure Case (with default)**

```ts
import { Result } from '@praha/byethrow';

const result: Result.Result<number, string> = Result.fail('Oops');
const error = Result.unwrapError(result, 'default'); // 'Oops'
```

**Success Case (without default)**

```ts
import { Result } from '@praha/byethrow';

const result: Result.Result<number, string> = Result.succeed(100);
const error = Result.unwrapError(result); // throws 100
```

**Success Case (with default)**

```ts
import { Result } from '@praha/byethrow';

const result: Result.Result<number, string> = Result.succeed(100);
const error = Result.unwrapError(result, 0); // 0
```

## See

[assertFailure](./Result.assertFailure.md) - When used with [assertFailure](./Result.assertFailure.md), you can safely unwrap the [Result](../types/Result.Result.md).

## Call Signature

> **unwrapError**\<`R`>(`result`): `true` _extends_ `HasPromise`\<`R`> ? `Promise`\<[`InferFailure`](../types/Result.InferFailure.md)\<`R`>> : [`InferFailure`](../types/Result.InferFailure.md)\<`R`>

### Type Parameters

#### R

`R` _extends_ [`ResultMaybeAsync`](../types/Result.ResultMaybeAsync.md)\<`any`, `any`>

### Parameters

#### result

`R`

### Returns

`true` _extends_ `HasPromise`\<`R`> ? `Promise`\<[`InferFailure`](../types/Result.InferFailure.md)\<`R`>> : [`InferFailure`](../types/Result.InferFailure.md)\<`R`>

## Call Signature

> **unwrapError**\<`R`, `T`>(`result`, `defaultValue`): `true` _extends_ `HasPromise`\<`R`> ? `Promise`\<`T` | [`InferFailure`](../types/Result.InferFailure.md)\<`R`>> : `T` | [`InferFailure`](../types/Result.InferFailure.md)\<`R`>

### Type Parameters

#### R

`R` _extends_ [`ResultMaybeAsync`](../types/Result.ResultMaybeAsync.md)\<`any`, `any`>

#### T

`T`

### Parameters

#### result

`R`

#### defaultValue

`T`

### Returns

`true` _extends_ `HasPromise`\<`R`> ? `Promise`\<`T` | [`InferFailure`](../types/Result.InferFailure.md)\<`R`>> : `T` | [`InferFailure`](../types/Result.InferFailure.md)\<`R`>

## Call Signature

> **unwrapError**\<`R`>(): (`result`) => `true` _extends_ `HasPromise`\<`R`> ? `Promise`\<[`InferFailure`](../types/Result.InferFailure.md)\<`R`>> : [`InferFailure`](../types/Result.InferFailure.md)\<`R`>

### Type Parameters

#### R

`R` _extends_ [`ResultMaybeAsync`](../types/Result.ResultMaybeAsync.md)\<`any`, `any`>

### Returns

(`result`) => `true` _extends_ `HasPromise`\<`R`> ? `Promise`\<[`InferFailure`](../types/Result.InferFailure.md)\<`R`>> : [`InferFailure`](../types/Result.InferFailure.md)\<`R`>

## Call Signature

> **unwrapError**\<`R`, `T`>(`defaultValue`): (`result`) => `true` _extends_ `HasPromise`\<`R`> ? `Promise`\<`T` | [`InferFailure`](../types/Result.InferFailure.md)\<`R`>> : `T` | [`InferFailure`](../types/Result.InferFailure.md)\<`R`>

### Type Parameters

#### R

`R` _extends_ [`ResultMaybeAsync`](../types/Result.ResultMaybeAsync.md)\<`any`, `any`>

#### T

`T`

### Parameters

#### defaultValue

`T`

### Returns

(`result`) => `true` _extends_ `HasPromise`\<`R`> ? `Promise`\<`T` | [`InferFailure`](../types/Result.InferFailure.md)\<`R`>> : `T` | [`InferFailure`](../types/Result.InferFailure.md)\<`R`>
