---
url: /docs/api/core/functions/isRepetitionBlock.md
---
[**@kaiord/core**](../README.md)

***

[@kaiord/core](../README.md) / isRepetitionBlock

# Function: isRepetitionBlock()

> **isRepetitionBlock**(`step`): step is { id?: string; repeatCount: number; steps: { duration: { seconds: number; type: "time" } | { meters: number; type: "distance" } | { bpm: number; type: "heart_rate_less_than" } | { bpm: number; repeatFrom: number; type: "repeat_until_heart_rate_greater_than" } | { calories: number; type: "calories" } | { type: "power_less_than"; watts: number } | { type: "power_greater_than"; watts: number } | { repeatFrom: number; seconds: number; type: "repeat_until_time" } | { meters: number; repeatFrom: number; type: "repeat_until_distance" } | { calories: number; repeatFrom: number; type: "repeat_until_calories" } | { bpm: number; repeatFrom: number; type: "repeat_until_heart_rate_less_than" } | { repeatFrom: number; type: "repeat_until_power_less_than"; watts: number } | { repeatFrom: number; type: "repeat_until_power_greater_than"; watts: number } | { type: "open" }; durationType: "time" | "distance" | "heart_rate_less_than" | "repeat_until_heart_rate_greater_than" | "calories" | "power_less_than" | "power_greater_than" | "repeat_until_time" | "repeat_until_distance" | "repeat_until_calories" | "repeat_until_heart_rate_less_than" | "repeat_until_power_less_than" | "repeat_until_power_greater_than" | "open"; equipment?: "none" | "swim_fins" | "swim_kickboard" | "swim_paddles" | "swim_pull_buoy" | "swim_snorkel"; extensions?: Record\<string, unknown>; intensity?: "warmup" | "active" | "cooldown" | "rest" | "recovery" | "interval" | "other"; name?: string; notes?: string; stepIndex: number; target: { type: "power"; value: { basis?: "percent_ftp"; max: number; min: number; unit: "range" } | { unit: "watts"; value: number } | { unit: "percent_ftp"; value: number } | { unit: "zone"; value: number } } | { type: "heart_rate"; value: { max: number; min: number; unit: "range" } | { unit: "bpm"; value: number } | { unit: "zone"; value: number } | { unit: "percent_max"; value: number } } | { type: "cadence"; value: { max: number; min: number; unit: "range" } | { unit: "rpm"; value: number } } | { type: "pace"; value: { max: number; min: number; unit: "range" } | { unit: "mps"; value: number } | { unit: "zone"; value: number } } | { type: "stroke_type"; value: { unit: "swim_stroke"; value: number } } | { type: "open" }; targetType: "cadence" | "power" | "open" | "heart_rate" | "pace" | "stroke_type" }\[] }

Defined in: [packages/core/src/domain/type-guards.ts:9](https://github.com/pablo-albaladejo/kaiord/blob/3eacbe62ef72342d970523967cc5155b5935bb85/packages/core/src/domain/type-guards.ts#L9)

Type guard to check if a workout step is a RepetitionBlock.

Checks for both `repeatCount` and `steps` properties to reliably
discriminate between WorkoutStep and RepetitionBlock union members.

## Parameters

### step

{ `duration`: { `seconds`: `number`; `type`: `"time"`; } | { `meters`: `number`; `type`: `"distance"`; } | { `bpm`: `number`; `type`: `"heart_rate_less_than"`; } | { `bpm`: `number`; `repeatFrom`: `number`; `type`: `"repeat_until_heart_rate_greater_than"`; } | { `calories`: `number`; `type`: `"calories"`; } | { `type`: `"power_less_than"`; `watts`: `number`; } | { `type`: `"power_greater_than"`; `watts`: `number`; } | { `repeatFrom`: `number`; `seconds`: `number`; `type`: `"repeat_until_time"`; } | { `meters`: `number`; `repeatFrom`: `number`; `type`: `"repeat_until_distance"`; } | { `calories`: `number`; `repeatFrom`: `number`; `type`: `"repeat_until_calories"`; } | { `bpm`: `number`; `repeatFrom`: `number`; `type`: `"repeat_until_heart_rate_less_than"`; } | { `repeatFrom`: `number`; `type`: `"repeat_until_power_less_than"`; `watts`: `number`; } | { `repeatFrom`: `number`; `type`: `"repeat_until_power_greater_than"`; `watts`: `number`; } | { `type`: `"open"`; }; `durationType`: `"time"` | `"distance"` | `"heart_rate_less_than"` | `"repeat_until_heart_rate_greater_than"` | `"calories"` | `"power_less_than"` | `"power_greater_than"` | `"repeat_until_time"` | `"repeat_until_distance"` | `"repeat_until_calories"` | `"repeat_until_heart_rate_less_than"` | `"repeat_until_power_less_than"` | `"repeat_until_power_greater_than"` | `"open"`; `equipment?`: `"none"` | `"swim_fins"` | `"swim_kickboard"` | `"swim_paddles"` | `"swim_pull_buoy"` | `"swim_snorkel"`; `extensions?`: `Record`<`string`, `unknown`>; `intensity?`: `"warmup"` | `"active"` | `"cooldown"` | `"rest"` | `"recovery"` | `"interval"` | `"other"`; `name?`: `string`; `notes?`: `string`; `stepIndex`: `number`; `target`: { `type`: `"power"`; `value`: { `basis?`: `"percent_ftp"`; `max`: `number`; `min`: `number`; `unit`: `"range"`; } | { `unit`: `"watts"`; `value`: `number`; } | { `unit`: `"percent_ftp"`; `value`: `number`; } | { `unit`: `"zone"`; `value`: `number`; }; } | { `type`: `"heart_rate"`; `value`: { `max`: `number`; `min`: `number`; `unit`: `"range"`; } | { `unit`: `"bpm"`; `value`: `number`; } | { `unit`: `"zone"`; `value`: `number`; } | { `unit`: `"percent_max"`; `value`: `number`; }; } | { `type`: `"cadence"`; `value`: { `max`: `number`; `min`: `number`; `unit`: `"range"`; } | { `unit`: `"rpm"`; `value`: `number`; }; } | { `type`: `"pace"`; `value`: { `max`: `number`; `min`: `number`; `unit`: `"range"`; } | { `unit`: `"mps"`; `value`: `number`; } | { `unit`: `"zone"`; `value`: `number`; }; } | { `type`: `"stroke_type"`; `value`: { `unit`: `"swim_stroke"`; `value`: `number`; }; } | { `type`: `"open"`; }; `targetType`: `"cadence"` | `"power"` | `"open"` | `"heart_rate"` | `"pace"` | `"stroke_type"`; } | { `id?`: `string`; `repeatCount`: `number`; `steps`: `object`\[]; }

## Returns

step is { id?: string; repeatCount: number; steps: { duration: { seconds: number; type: "time" } | { meters: number; type: "distance" } | { bpm: number; type: "heart_rate_less_than" } | { bpm: number; repeatFrom: number; type: "repeat_until_heart_rate_greater_than" } | { calories: number; type: "calories" } | { type: "power_less_than"; watts: number } | { type: "power_greater_than"; watts: number } | { repeatFrom: number; seconds: number; type: "repeat_until_time" } | { meters: number; repeatFrom: number; type: "repeat_until_distance" } | { calories: number; repeatFrom: number; type: "repeat_until_calories" } | { bpm: number; repeatFrom: number; type: "repeat_until_heart_rate_less_than" } | { repeatFrom: number; type: "repeat_until_power_less_than"; watts: number } | { repeatFrom: number; type: "repeat_until_power_greater_than"; watts: number } | { type: "open" }; durationType: "time" | "distance" | "heart_rate_less_than" | "repeat_until_heart_rate_greater_than" | "calories" | "power_less_than" | "power_greater_than" | "repeat_until_time" | "repeat_until_distance" | "repeat_until_calories" | "repeat_until_heart_rate_less_than" | "repeat_until_power_less_than" | "repeat_until_power_greater_than" | "open"; equipment?: "none" | "swim_fins" | "swim_kickboard" | "swim_paddles" | "swim_pull_buoy" | "swim_snorkel"; extensions?: Record\<string, unknown>; intensity?: "warmup" | "active" | "cooldown" | "rest" | "recovery" | "interval" | "other"; name?: string; notes?: string; stepIndex: number; target: { type: "power"; value: { basis?: "percent_ftp"; max: number; min: number; unit: "range" } | { unit: "watts"; value: number } | { unit: "percent_ftp"; value: number } | { unit: "zone"; value: number } } | { type: "heart_rate"; value: { max: number; min: number; unit: "range" } | { unit: "bpm"; value: number } | { unit: "zone"; value: number } | { unit: "percent_max"; value: number } } | { type: "cadence"; value: { max: number; min: number; unit: "range" } | { unit: "rpm"; value: number } } | { type: "pace"; value: { max: number; min: number; unit: "range" } | { unit: "mps"; value: number } | { unit: "zone"; value: number } } | { type: "stroke_type"; value: { unit: "swim_stroke"; value: number } } | { type: "open" }; targetType: "cadence" | "power" | "open" | "heart_rate" | "pace" | "stroke_type" }\[] }
